Skip to content

Commit 158fba7

Browse files
committed
Done: Implementation and tests
1 parent 4ab4f34 commit 158fba7

File tree

5 files changed

+40
-27
lines changed

5 files changed

+40
-27
lines changed

libcxx/include/sstream

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -416,9 +416,9 @@ public:
416416
template <class _Tp>
417417
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
418418
_LIBCPP_HIDE_FROM_ABI basic_stringbuf(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)
419-
: basic_stringbuf(__which, __a) {
419+
: __hm_(nullptr), __mode_(__which | ios_base::in | ios_base::out) {
420420
basic_string_view<_CharT, _Traits> __sv = __t;
421-
__str_ = __sv;
421+
__str_ = string_type(__sv, __a);
422422
__init_buf_ptrs();
423423
}
424424

@@ -898,16 +898,17 @@ public:
898898

899899
template <class _Tp>
900900
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
901-
explicit basic_istringstream(const _Tp& __t, ios_base::openmode __which = ios_base::in)
902-
: basic_istringstream(__t, __which, _Allocator()) {}
901+
_LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(const _Tp& __t, ios_base::openmode __which = ios_base::in)
902+
: basic_istringstream(__t, __which | ios_base::in, _Allocator()) {}
903903

904904
template <class _Tp>
905905
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
906-
basic_istringstream(const _Tp& __t, const _Allocator& __a) : basic_istringstream(__t, ios_base::in, __a) {}
906+
_LIBCPP_HIDE_FROM_ABI basic_istringstream(const _Tp& __t, const _Allocator& __a)
907+
: basic_istringstream(__t, ios_base::in, __a) {}
907908

908909
template <class _Tp>
909910
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
910-
basic_istringstream(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)
911+
_LIBCPP_HIDE_FROM_ABI basic_istringstream(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)
911912
: basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__t, __which | ios_base::in, __a) {}
912913

913914
#endif // _LIBCPP_STD_VER >= 26
@@ -1031,16 +1032,17 @@ public:
10311032

10321033
template <class _Tp>
10331034
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
1034-
explicit basic_ostringstream(const _Tp& __t, ios_base::openmode __which = ios_base::out)
1035-
: basic_ostringstream(__t, __which, _Allocator()) {}
1035+
_LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(const _Tp& __t, ios_base::openmode __which = ios_base::out)
1036+
: basic_ostringstream(__t, __which | ios_base::out, _Allocator()) {}
10361037

10371038
template <class _Tp>
10381039
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
1039-
basic_ostringstream(const _Tp& __t, const _Allocator& __a) : basic_ostringstream(__t, ios_base::out, __a) {}
1040+
_LIBCPP_HIDE_FROM_ABI basic_ostringstream(const _Tp& __t, const _Allocator& __a)
1041+
: basic_ostringstream(__t, ios_base::out, __a) {}
10401042

10411043
template <class _Tp>
10421044
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
1043-
basic_ostringstream(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)
1045+
_LIBCPP_HIDE_FROM_ABI basic_ostringstream(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)
10441046
: basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__t, __which | ios_base::out, __a) {}
10451047

10461048
#endif // _LIBCPP_STD_VER >= 26
@@ -1168,19 +1170,19 @@ public:
11681170

11691171
template <class _Tp>
11701172
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
1171-
explicit basic_stringstream(const _Tp& __t, ios_base::openmode __which = ios_base::out | ios_base::in)
1173+
_LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(const _Tp& __t,
1174+
ios_base::openmode __which = ios_base::out | ios_base::in)
11721175
: basic_stringstream(__t, __which, _Allocator()) {}
11731176

11741177
template <class _Tp>
11751178
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
1176-
basic_stringstream(const _Tp& __t, const _Allocator& __a)
1179+
_LIBCPP_HIDE_FROM_ABI basic_stringstream(const _Tp& __t, const _Allocator& __a)
11771180
: basic_stringstream(__t, ios_base::out | ios_base::in, __a) {}
11781181

11791182
template <class _Tp>
11801183
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
1181-
basic_stringstream(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)
1182-
: basic_iostream<_CharT, _Traits>(std::addressof(__sb_)),
1183-
__sb_(__t, __which | ios_base::out | ios_base::in, __a) {}
1184+
_LIBCPP_HIDE_FROM_ABI basic_stringstream(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)
1185+
: basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__t, __which, __a) {}
11841186

11851187
#endif // _LIBCPP_STD_VER >= 26
11861188

libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.cons/string_view.mode.alloc.pass.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,21 +110,23 @@ static void test() {
110110
// const CharT*
111111
{
112112
std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
113-
CS("zmt"), std::ios_base::binary, ca);
113+
CS("zmt"), std::ios_base::out | std::ios_base::in, ca);
114114
assert(ss.str() == CS("zmt"));
115115
assert(ss.get_allocator() == ca);
116116
}
117117
// std::basic_string_view<CharT>
118118
{
119119
const auto csv = SV("zmt");
120-
std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(csv, std::ios_base::binary, ca);
120+
std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
121+
csv, std::ios_base::out | std::ios_base::in, ca);
121122
assert(ss.str() == CS("zmt"));
122123
assert(ss.get_allocator() == ca);
123124
}
124125
// std::basic_string<CharT>
125126
{
126127
const auto cs = ST("zmt");
127-
std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(cs, std::ios_base::binary, ca);
128+
std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
129+
cs, std::ios_base::out | std::ios_base::in, ca);
128130
assert(ss.str() == CS("zmt"));
129131
assert(ss.get_allocator() == ca);
130132
}

libcxx/test/std/input.output/string.streams/stringbuf/stringbuf.cons/string_view.mode.pass.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,19 +83,22 @@ template <class CharT>
8383
static void test() {
8484
// const CharT*
8585
{
86-
std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(CS("zmt"), std::ios_base::binary);
86+
std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
87+
CS("zmt"), std::ios_base::out | std::ios_base::in);
8788
assert(ss.str() == CS("zmt"));
8889
}
8990
// std::basic_string_view<CharT>
9091
{
9192
const auto csv = SV("zmt");
92-
std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(csv, std::ios_base::binary);
93+
std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
94+
csv, std::ios_base::out | std::ios_base::in);
9395
assert(ss.str() == CS("zmt"));
9496
}
9597
// std::basic_string<CharT>
9698
{
9799
const auto cs = ST("zmt");
98-
std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(cs, std::ios_base::binary);
100+
std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
101+
cs, std::ios_base::out | std::ios_base::in);
99102
assert(ss.str() == CS("zmt"));
100103
}
101104
}

libcxx/test/std/input.output/string.streams/stringstream/stringstream.cons/string_view.mode.alloc.pass.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ void test_sfinae() {
102102
#define CS(S) MAKE_CSTRING(CharT, S)
103103
#define ST(S) MAKE_STRING(CharT, S)
104104
#define SV(S) MAKE_STRING_VIEW(CharT, S)
105+
#include <print>
105106

106107
template <class CharT>
107108
static void test() {
@@ -110,21 +111,23 @@ static void test() {
110111
// const CharT*
111112
{
112113
std::basic_stringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
113-
CS("zmt"), std::ios_base::binary, ca);
114+
CS("zmt"), std::ios_base::out | std::ios_base::in, ca);
114115
assert(ss.str() == CS("zmt"));
115116
assert(ss.rdbuf()->get_allocator() == ca);
116117
}
117118
// std::basic_string_view<CharT>
118119
{
119120
const auto csv = SV("zmt");
120-
std::basic_stringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(csv, std::ios_base::binary, ca);
121+
std::basic_stringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
122+
csv, std::ios_base::out | std::ios_base::in, ca);
121123
assert(ss.str() == CS("zmt"));
122124
assert(ss.rdbuf()->get_allocator() == ca);
123125
}
124126
// std::basic_string<CharT>
125127
{
126128
const auto cs = ST("zmt");
127-
std::basic_stringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(cs, std::ios_base::binary, ca);
129+
std::basic_stringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
130+
cs, std::ios_base::out | std::ios_base::in, ca);
128131
assert(ss.str() == CS("zmt"));
129132
assert(ss.rdbuf()->get_allocator() == ca);
130133
}

libcxx/test/std/input.output/string.streams/stringstream/stringstream.cons/string_view.mode.pass.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,19 +84,22 @@ template <class CharT>
8484
static void test() {
8585
// const CharT*
8686
{
87-
std::basic_stringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(CS("zmt"), std::ios_base::binary);
87+
std::basic_stringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
88+
CS("zmt"), std::ios_base::out | std::ios_base::in);
8889
assert(ss.str() == CS("zmt"));
8990
}
9091
// std::basic_string_view<CharT>
9192
{
9293
const auto csv = SV("zmt");
93-
std::basic_stringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(csv, std::ios_base::binary);
94+
std::basic_stringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
95+
csv, std::ios_base::out | std::ios_base::in);
9496
assert(ss.str() == CS("zmt"));
9597
}
9698
// std::basic_string<CharT>
9799
{
98100
const auto cs = ST("zmt");
99-
std::basic_stringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(cs, std::ios_base::binary);
101+
std::basic_stringstream<CharT, std::char_traits<CharT>, test_allocator<CharT>> ss(
102+
cs, std::ios_base::out | std::ios_base::in);
100103
assert(ss.str() == CS("zmt"));
101104
}
102105
}

0 commit comments

Comments
 (0)