16
16
// template<class T>
17
17
// basic_istringstream(const T& t, ios_base::openmode which, const Allocator& a);
18
18
19
- #include < array>
20
19
#include < cassert>
20
+ #include < concepts>
21
21
#include < sstream>
22
22
#include < string>
23
23
#include < string_view>
27
27
#include " test_convertible.h"
28
28
#include " test_macros.h"
29
29
30
- template <typename S, typename T, typename A>
31
- concept HasMember = requires (const T& sv, std::ios_base::openmode w, const A& a) {
32
- { S (sv, w, a) };
33
- };
34
-
35
30
template <typename CharT>
36
- void test_constraints () {
31
+ void test_sfinae () {
37
32
struct SomeObject {};
38
33
struct NonAllocator {};
39
34
40
35
// `const CharT*`
41
- static_assert (HasMember <std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
42
- const CharT*,
43
- test_allocator<CharT>>);
36
+ static_assert (std::constructible_from <std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
37
+ const CharT*,
38
+ test_allocator<CharT>>);
44
39
static_assert (test_convertible<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
45
40
const CharT*,
46
41
std::ios_base::openmode,
47
- test_allocator<CharT>>());
42
+ const test_allocator<CharT>>());
48
43
// `std::basic_string_view<CharT>`
49
- static_assert (HasMember<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
50
- std::basic_string_view<CharT>,
51
- test_allocator<CharT>>);
44
+ static_assert (std::constructible_from<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
45
+ std::basic_string_view<CharT>,
46
+ std::ios_base::openmode,
47
+ test_allocator<CharT>>);
52
48
static_assert (test_convertible<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
53
- std::basic_string_view<CharT>,
49
+ const std::basic_string_view<CharT>,
54
50
std::ios_base::openmode,
55
- test_allocator<CharT>>());
51
+ const test_allocator<CharT>>());
56
52
// `std::basic_string<CharT>`
57
- static_assert (HasMember <std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
58
- std::basic_string<CharT>,
59
- std::ios_base::openmode,
60
- test_allocator<CharT>>);
53
+ static_assert (std::constructible_from <std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
54
+ const std::basic_string<CharT>,
55
+ std::ios_base::openmode,
56
+ const test_allocator<CharT>>);
61
57
static_assert (test_convertible<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
62
- std::basic_string<CharT>,
58
+ const std::basic_string<CharT>,
63
59
std::ios_base::openmode,
64
- test_allocator<CharT>>());
65
-
66
- // Non-convertible to std::`basic_string_view<CharT>`
60
+ const test_allocator<CharT>>());
61
+
62
+ // String-view-like
63
+ static_assert (
64
+ !std::constructible_from<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
65
+ const int ,
66
+ std::ios_base::openmode,
67
+ const test_allocator<CharT>>);
67
68
static_assert (!test_convertible<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
68
- int ,
69
+ const int ,
69
70
std::ios_base::openmode,
70
- test_allocator<CharT>>());
71
- static_assert (!test_convertible<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
72
- const int &,
73
- std::ios_base::openmode,
74
- test_allocator<CharT>>());
75
- static_assert (!test_convertible<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
76
- SomeObject,
77
- std::ios_base::openmode,
78
- test_allocator<CharT>>());
71
+ const test_allocator<CharT>>());
72
+
73
+ static_assert (
74
+ !std::constructible_from<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
75
+ const SomeObject,
76
+ std::ios_base::openmode,
77
+ const test_allocator<CharT>>);
79
78
static_assert (!test_convertible<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
80
- const SomeObject& ,
79
+ const SomeObject,
81
80
std::ios_base::openmode,
82
- test_allocator<CharT>>());
81
+ const test_allocator<CharT>>());
83
82
84
83
// Mode
84
+ static_assert (
85
+ !std::constructible_from<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
86
+ const std::basic_string_view<CharT>,
87
+ SomeObject,
88
+ const NonAllocator>);
85
89
static_assert (!test_convertible<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
86
- std::basic_string <CharT>,
90
+ const std::basic_string_view <CharT>,
87
91
SomeObject,
88
- NonAllocator>());
92
+ const NonAllocator>());
89
93
90
94
// Allocator
95
+ static_assert (
96
+ !std::constructible_from<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
97
+ const std::basic_string_view<CharT>,
98
+ std::ios_base::openmode,
99
+ const NonAllocator>);
91
100
static_assert (!test_convertible<std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>,
92
- std::basic_string <CharT>,
101
+ const std::basic_string_view <CharT>,
93
102
std::ios_base::openmode,
94
- NonAllocator>());
103
+ const NonAllocator>());
95
104
}
96
105
97
- // #include <concepts>
98
- // #include <type_traits>
99
-
100
- // static_assert(std::is_constructible_v<std::istringstream, std::string_view>);
101
- // static_assert(test_convertible<std::basic_istringstream<char, std::char_traits<char>>,
102
- // const char*,
103
- // std::ios_base::openmode>());
104
- // static_assert(std::is_constructible_v<std::istringstream, int, test_allocator<int>>);
105
-
106
- // static_assert(HasMember<std::istringstream, std::string_view, test_allocator<char>>);
107
-
108
- // std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>>
109
- // static_assert(HasMember<std::basic_istringstream<char, std::char_traits<char>, test_allocator<char>>,
110
- // const char*,
111
- // test_allocator<char>>);
112
-
113
- // // std::istringstream
114
- // static_assert(HasMember<std::istringstream, std::string_view>);
115
- // # ifndef TEST_HAS_NO_WIDE_CHARACTERS
116
- // static_assert(!HasMember<std::istringstream, std::wstring_view>);
117
- // # endif
118
- // static_assert(HasMember<std::istringstream, const char*>);
119
- // # ifndef TEST_HAS_NO_WIDE_CHARACTERS
120
- // static_assert(!HasMember<std::istringstream, const wchar_t*>);
121
- // # endif
122
- // static_assert(HasMember<std::istringstream, std::string>);
123
- // # ifndef TEST_HAS_NO_WIDE_CHARACTERS
124
- // static_assert(!HasMember<std::istringstream, std::wstring>);
125
- // # endif
126
- // static_assert(!HasMember<std::istringstream, std::array<char, 1>>);
127
- // static_assert(!HasMember<std::istringstream, std::array<char, 0>>);
128
- // // static_assert(!HasMember<std::istringstream, char>);
129
- // // static_assert(!HasMember<std::istringstream, int>);
130
- // static_assert(!HasMember<std::istringstream, SomeObject>);
131
- // static_assert(!HasMember<std::istringstream, std::nullptr_t>);
132
-
133
- // // std::wistringstream
134
-
135
- // # ifndef TEST_HAS_NO_WIDE_CHARACTERS
136
- // static_assert(HasMember<std::wistringstream, std::wstring_view>);
137
- // static_assert(!HasMember<std::wistringstream, std::string_view>);
138
- // static_assert(HasMember<std::wistringstream, const wchar_t*>);
139
- // static_assert(!HasMember<std::wistringstream, const char*>);
140
- // static_assert(HasMember<std::wistringstream, std::wstring>);
141
- // static_assert(!HasMember<std::wistringstream, std::string>);
142
- // static_assert(!HasMember<std::istringstream, std::array<wchar_t, 0>>);
143
- // // static_assert(!HasMember<std::wistringstream, wchar_t>);
144
- // // static_assert(!HasMember<std::wistringstream, int>);
145
- // static_assert(!HasMember<std::wistringstream, SomeObject>);
146
- // static_assert(!HasMember<std::wistringstream, std::nullptr_t>);
147
- // # endif
148
-
149
106
#define CS (S ) MAKE_CSTRING(CharT, S)
150
107
#define ST (S ) MAKE_STRING(CharT, S)
151
108
#define SV (S ) MAKE_STRING_VIEW(CharT, S)
@@ -156,34 +113,32 @@ static void test() {
156
113
157
114
// const CharT*
158
115
{
159
- const std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss (
116
+ std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss (
160
117
CS (" zmt" ), std::ios_base::binary, ca);
161
118
assert (ss.str () == CS (" zmt" ));
162
119
assert (ss.rdbuf ()->get_allocator () == ca);
163
120
}
164
121
// std::basic_string_view<CharT>
165
122
{
166
123
const auto csv = SV (" zmt" );
167
- const std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss (
168
- csv, std::ios_base::binary, ca);
124
+ std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss (csv, std::ios_base::binary, ca);
169
125
assert (ss.str () == CS (" zmt" ));
170
126
assert (ss.rdbuf ()->get_allocator () == ca);
171
127
}
172
128
// std::basic_string<CharT>
173
129
{
174
130
const auto cs = ST (" zmt" );
175
- const std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss (
176
- cs, std::ios_base::binary, ca);
131
+ std::basic_istringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss (cs, std::ios_base::binary, ca);
177
132
assert (ss.str () == CS (" zmt" ));
178
133
assert (ss.rdbuf ()->get_allocator () == ca);
179
134
}
180
135
}
181
136
182
137
int main (int , char **) {
183
- test_constraints <char >();
138
+ test_sfinae <char >();
184
139
test<char >();
185
140
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
186
- test_constraints <wchar_t >();
141
+ test_sfinae <wchar_t >();
187
142
test<wchar_t >();
188
143
#endif
189
144
return 0 ;
0 commit comments