151 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_istringstream15 16// template<class T>17// explicit basic_istringstream(const T& t, ios_base::openmode which);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_istringstream<nasty_char, nasty_char_traits, test_allocator<nasty_char>>;39 40 static_assert(std::constructible_from<NStrStream, nasty_char*, test_allocator<nasty_char>>);41 static_assert(!test_convertible<NStrStream, nasty_char*, std::ios_base::openmode>());42 43 // const nasty_char*44 using NStrStream = std::basic_istringstream<nasty_char, nasty_char_traits, test_allocator<nasty_char>>;45 46 static_assert(std::constructible_from<NStrStream, const nasty_char*, test_allocator<nasty_char>>);47 static_assert(!test_convertible<NStrStream, const nasty_char*, std::ios_base::openmode>());48}49 50template <typename CharT, typename TraitsT = std::char_traits<CharT>, typename AllocT = std::allocator<CharT>>51void test_sfinae() {52 using StrStream = std::basic_istringstream<CharT, TraitsT, AllocT>;53 54 // `CharT*`55 static_assert(std::constructible_from<StrStream, CharT*, std::ios_base::openmode>);56 static_assert(!test_convertible<StrStream, CharT*, std::ios_base::openmode>());57 58 // `const CharT*`59 static_assert(std::constructible_from<StrStream, const CharT*, std::ios_base::openmode>);60 static_assert(!test_convertible<StrStream, const CharT*, std::ios_base::openmode>());61 62 // `std::basic_string_view<CharT>`63 static_assert(64 std::constructible_from<StrStream, const std::basic_string_view<CharT, TraitsT>, std::ios_base::openmode>);65 static_assert(!test_convertible<StrStream, const std::basic_string_view<CharT, TraitsT>, std::ios_base::openmode>());66 67 // `std::basic_string<CharT>`68 static_assert(std::constructible_from<StrStream, const std::basic_string<CharT, TraitsT>, std::ios_base::openmode>);69 static_assert(!test_convertible<StrStream, const std::basic_string<CharT, TraitsT>, std::ios_base::openmode>());70 71 // ConstConvertibleStringView<CharT>72 static_assert(73 std::constructible_from<StrStream, const ConstConvertibleStringView<CharT, TraitsT>, std::ios_base::openmode>);74 static_assert(75 !test_convertible<StrStream, const ConstConvertibleStringView<CharT, TraitsT>, std::ios_base::openmode>());76 77 // NonConstConvertibleStringView<CharT>78 static_assert(79 !std::constructible_from<StrStream, NonConstConvertibleStringView<CharT, TraitsT>, std::ios_base::openmode>);80 static_assert(!test_convertible<StrStream, NonConstConvertibleStringView<CharT, TraitsT>, std::ios_base::openmode>());81 82 static_assert(83 !std::84 constructible_from<StrStream, const NonConstConvertibleStringView<CharT, TraitsT>, std::ios_base::openmode>);85 static_assert(86 !test_convertible<StrStream, const NonConstConvertibleStringView<CharT, TraitsT>, std::ios_base::openmode>());87 88 // Non-`string-view-like`89 static_assert(!std::constructible_from<StrStream, const SomeObject, std::ios_base::openmode>);90 static_assert(!test_convertible<StrStream, const SomeObject, std::ios_base::openmode>());91 92 // Non-mode93 static_assert(!std::constructible_from<StrStream, const std::basic_string_view<CharT, TraitsT>, const SomeObject>);94 static_assert(!test_convertible<StrStream, const std::basic_string_view<CharT, TraitsT>, const SomeObject>());95}96 97template <typename CharT, typename TraitsT = std::char_traits<CharT>, typename AllocT = std::allocator<CharT>>98void test() {99 using StrStream = std::basic_istringstream<CharT, TraitsT, AllocT>;100 101 const AllocT allocator;102 103 // const CharT*104 {105 StrStream ss(CS("zmt"), std::ios_base::binary);106 assert(ss.str() == CS("zmt"));107 }108 // std::basic_string_view<CharT>109 {110 const std::basic_string_view<CharT, TraitsT> csv = SV("zmt");111 StrStream ss(csv, std::ios_base::binary);112 assert(ss.str() == CS("zmt"));113 }114 // std::basic_string<CharT>115 {116 const std::basic_string<CharT, TraitsT, AllocT> cs = ST("zmt", allocator);117 StrStream ss(cs, std::ios_base::binary);118 assert(ss.str() == CS("zmt"));119 }120 // ConstConvertibleStringView<CharT>121 {122 const ConstConvertibleStringView<CharT, TraitsT> sv{CS("zmt")};123 StrStream ss(sv, std::ios_base::binary);124 assert(ss.str() == CS("zmt"));125 }126}127 128int main(int, char**) {129 test_sfinae_with_nasty_char();130 test_sfinae_with_nasty_char<test_allocator<nasty_char>>();131 test_sfinae<char>();132 test_sfinae<char, constexpr_char_traits<char>, std::allocator<char>>();133 test_sfinae<char, std::char_traits<char>, test_allocator<char>>();134 test_sfinae<char, constexpr_char_traits<char>, test_allocator<char>>();135 test<char>();136 test<char, constexpr_char_traits<char>, std::allocator<char>>();137 test<char, std::char_traits<char>, test_allocator<char>>();138 test<char, constexpr_char_traits<char>, test_allocator<char>>();139#ifndef TEST_HAS_NO_WIDE_CHARACTERS140 test_sfinae<wchar_t>();141 test_sfinae<wchar_t, constexpr_char_traits<wchar_t>, std::allocator<wchar_t>>();142 test_sfinae<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t>>();143 test_sfinae<wchar_t, constexpr_char_traits<wchar_t>, test_allocator<wchar_t>>();144 test<wchar_t>();145 test<wchar_t, constexpr_char_traits<wchar_t>, std::allocator<wchar_t>>();146 test<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t>>();147 test<wchar_t, constexpr_char_traits<wchar_t>, test_allocator<wchar_t>>();148#endif149 return 0;150}151