1*80f9458cSHristo Hristov //===----------------------------------------------------------------------===//
2*80f9458cSHristo Hristov //
3*80f9458cSHristo Hristov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*80f9458cSHristo Hristov // See https://llvm.org/LICENSE.txt for license information.
5*80f9458cSHristo Hristov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*80f9458cSHristo Hristov //
7*80f9458cSHristo Hristov //===----------------------------------------------------------------------===//
8*80f9458cSHristo Hristov
9*80f9458cSHristo Hristov // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20, c++23
10*80f9458cSHristo Hristov
11*80f9458cSHristo Hristov // <sstream>
12*80f9458cSHristo Hristov
13*80f9458cSHristo Hristov // template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT>>
14*80f9458cSHristo Hristov // class basic_stringbuf
15*80f9458cSHristo Hristov
16*80f9458cSHristo Hristov // template<class T>
17*80f9458cSHristo Hristov // void str(const T& t);
18*80f9458cSHristo Hristov
19*80f9458cSHristo Hristov #include <cassert>
20*80f9458cSHristo Hristov #include <memory>
21*80f9458cSHristo Hristov #include <sstream>
22*80f9458cSHristo Hristov #include <string>
23*80f9458cSHristo Hristov #include <string_view>
24*80f9458cSHristo Hristov
25*80f9458cSHristo Hristov #include "constexpr_char_traits.h"
26*80f9458cSHristo Hristov #include "nasty_string.h"
27*80f9458cSHristo Hristov #include "test_allocator.h"
28*80f9458cSHristo Hristov #include "test_macros.h"
29*80f9458cSHristo Hristov
30*80f9458cSHristo Hristov #include "../../helper_concepts.h"
31*80f9458cSHristo Hristov #include "../../helper_string_macros.h"
32*80f9458cSHristo Hristov #include "../../helper_types.h"
33*80f9458cSHristo Hristov
34*80f9458cSHristo Hristov template <typename AllocT = std::allocator<nasty_char>>
test_sfinae_with_nasty_char()35*80f9458cSHristo Hristov void test_sfinae_with_nasty_char() {
36*80f9458cSHristo Hristov using NStrBuf = std::basic_stringbuf<nasty_char, nasty_char_traits, AllocT>;
37*80f9458cSHristo Hristov
38*80f9458cSHristo Hristov static_assert(is_valid_argument_for_str_member<NStrBuf, nasty_char*>);
39*80f9458cSHristo Hristov static_assert(is_valid_argument_for_str_member<NStrBuf, const nasty_char*>);
40*80f9458cSHristo Hristov }
41*80f9458cSHristo Hristov
42*80f9458cSHristo Hristov template <typename CharT, typename TraitsT = std::char_traits<CharT>, typename AllocT = std::allocator<CharT>>
test_sfinae()43*80f9458cSHristo Hristov void test_sfinae() {
44*80f9458cSHristo Hristov using StrBuff = std::basic_stringbuf<CharT, TraitsT, AllocT>;
45*80f9458cSHristo Hristov
46*80f9458cSHristo Hristov static_assert(is_valid_argument_for_str_member<StrBuff, CharT*>);
47*80f9458cSHristo Hristov static_assert(is_valid_argument_for_str_member<StrBuff, const CharT*>);
48*80f9458cSHristo Hristov static_assert(is_valid_argument_for_str_member<StrBuff, std::basic_string_view<CharT, TraitsT>>);
49*80f9458cSHristo Hristov static_assert(is_valid_argument_for_str_member<StrBuff, std::basic_string<CharT, TraitsT, AllocT>>);
50*80f9458cSHristo Hristov static_assert(is_valid_argument_for_str_member<StrBuff, ConstConvertibleStringView<CharT, TraitsT>>);
51*80f9458cSHristo Hristov
52*80f9458cSHristo Hristov static_assert(!is_valid_argument_for_str_member<StrBuff, CharT>);
53*80f9458cSHristo Hristov static_assert(!is_valid_argument_for_str_member<StrBuff, int>);
54*80f9458cSHristo Hristov static_assert(!is_valid_argument_for_str_member<StrBuff, SomeObject>);
55*80f9458cSHristo Hristov static_assert(!is_valid_argument_for_str_member<StrBuff, std::nullptr_t>);
56*80f9458cSHristo Hristov static_assert(!is_valid_argument_for_str_member<StrBuff, NonConstConvertibleStringView<CharT, TraitsT>>);
57*80f9458cSHristo Hristov }
58*80f9458cSHristo Hristov
59*80f9458cSHristo Hristov template <typename CharT, typename TraitsT = std::char_traits<CharT>, typename AllocT = std::allocator<CharT>>
test()60*80f9458cSHristo Hristov void test() {
61*80f9458cSHristo Hristov AllocT allocator;
62*80f9458cSHristo Hristov
63*80f9458cSHristo Hristov std::basic_stringbuf<CharT, TraitsT, AllocT> ss(std::ios_base::in | std::ios_base::out, allocator);
64*80f9458cSHristo Hristov assert(ss.str().empty());
65*80f9458cSHristo Hristov
66*80f9458cSHristo Hristov // const CharT*
67*80f9458cSHristo Hristov ss.str(CS("ba"));
68*80f9458cSHristo Hristov assert(ss.str() == CS("ba"));
69*80f9458cSHristo Hristov
70*80f9458cSHristo Hristov // std::basic_string_view<CharT>
71*80f9458cSHristo Hristov ss.str(SV("ma"));
72*80f9458cSHristo Hristov assert(ss.str() == CS("ma"));
73*80f9458cSHristo Hristov
74*80f9458cSHristo Hristov // std::basic_string<CharT>
75*80f9458cSHristo Hristov ss.str(ST("zmt", allocator));
76*80f9458cSHristo Hristov assert(ss.str() == CS("zmt"));
77*80f9458cSHristo Hristov
78*80f9458cSHristo Hristov // ConstConvertibleStringView<CharT>
79*80f9458cSHristo Hristov ss.str(ConstConvertibleStringView<CharT, TraitsT>{CS("da")});
80*80f9458cSHristo Hristov assert(ss.str() == CS("da"));
81*80f9458cSHristo Hristov
82*80f9458cSHristo Hristov const std::basic_string<CharT, TraitsT, AllocT> s(allocator);
83*80f9458cSHristo Hristov ss.str(s);
84*80f9458cSHristo Hristov assert(ss.str().empty());
85*80f9458cSHristo Hristov }
86*80f9458cSHristo Hristov
main(int,char **)87*80f9458cSHristo Hristov int main(int, char**) {
88*80f9458cSHristo Hristov test_sfinae_with_nasty_char();
89*80f9458cSHristo Hristov test_sfinae_with_nasty_char<test_allocator<nasty_char>>();
90*80f9458cSHristo Hristov test_sfinae<char>();
91*80f9458cSHristo Hristov test_sfinae<char, constexpr_char_traits<char>, std::allocator<char>>();
92*80f9458cSHristo Hristov test_sfinae<char, std::char_traits<char>, test_allocator<char>>();
93*80f9458cSHristo Hristov test_sfinae<char, constexpr_char_traits<char>, test_allocator<char>>();
94*80f9458cSHristo Hristov test<char>();
95*80f9458cSHristo Hristov test<char, constexpr_char_traits<char>, std::allocator<char>>();
96*80f9458cSHristo Hristov test<char, std::char_traits<char>, test_allocator<char>>();
97*80f9458cSHristo Hristov test<char, constexpr_char_traits<char>, test_allocator<char>>();
98*80f9458cSHristo Hristov #ifndef TEST_HAS_NO_WIDE_CHARACTERS
99*80f9458cSHristo Hristov test_sfinae<wchar_t>();
100*80f9458cSHristo Hristov test_sfinae<wchar_t, constexpr_char_traits<wchar_t>, std::allocator<wchar_t>>();
101*80f9458cSHristo Hristov test_sfinae<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t>>();
102*80f9458cSHristo Hristov test_sfinae<wchar_t, constexpr_char_traits<wchar_t>, test_allocator<wchar_t>>();
103*80f9458cSHristo Hristov test<wchar_t>();
104*80f9458cSHristo Hristov test<wchar_t, constexpr_char_traits<wchar_t>, std::allocator<wchar_t>>();
105*80f9458cSHristo Hristov test<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t>>();
106*80f9458cSHristo Hristov test<wchar_t, constexpr_char_traits<wchar_t>, test_allocator<wchar_t>>();
107*80f9458cSHristo Hristov #endif
108*80f9458cSHristo Hristov
109*80f9458cSHristo Hristov return 0;
110*80f9458cSHristo Hristov }
111