Skip to content

[libc++][sstream] P2495R3: Interfacing stringstreams with string_view #80552

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
d34e182
[libc++][streams] P2495R3: Interfacing `stringstreams` with `string_v…
H-G-Hristov Jan 31, 2024
38a5cf2
Refactored: `str`, ctrs
H-G-Hristov Feb 3, 2024
5948644
Added all tests
H-G-Hristov Feb 3, 2024
c228f06
Done: Implementation and tests
H-G-Hristov Feb 3, 2024
ed97494
Generated FTM
H-G-Hristov Feb 3, 2024
23d4a57
Fixed transitive includes
H-G-Hristov Feb 3, 2024
d9e93cf
Disabled failing tests with new constructors in c++26 mode
H-G-Hristov Feb 3, 2024
879bc43
Fixed `std::basic_stringbuf`
H-G-Hristov Feb 3, 2024
6483ddb
Addressed some comments
H-G-Hristov Feb 12, 2024
7f7b09d
Merge branch 'main' into hgh/libcxx/P2495R3-Interfacing-string-stream…
H-G-Hristov Feb 12, 2024
aeee469
WIP: adding `constexpr_char_traits`
H-G-Hristov Feb 12, 2024
d0304d0
Merge branch 'main' into hgh/libcxx/P2495R3-Interfacing-string-stream…
H-G-Hristov Feb 13, 2024
bc67da4
Updated: libcxx/test/std/input.output/string.streams/istringstream/is…
H-G-Hristov Feb 14, 2024
091bc72
WIP: Added `ConstConvertibleStringView`
H-G-Hristov Feb 16, 2024
3f04eb0
Updated: `string_view.alloc.pass`
H-G-Hristov Feb 18, 2024
0354a1a
Merge branch 'main' into hgh/libcxx/P2495R3-Interfacing-string-stream…
H-G-Hristov Feb 18, 2024
5e9f49e
Updated: `str.string_view.pass`
H-G-Hristov Feb 18, 2024
10286b2
Fix formatting
H-G-Hristov Feb 18, 2024
dc81b24
Fixes
H-G-Hristov Feb 18, 2024
276855c
Fixes
H-G-Hristov Feb 18, 2024
ed320fd
Fixes
H-G-Hristov Feb 18, 2024
6cd0d59
Fix
H-G-Hristov Feb 18, 2024
5d08266
Fix
H-G-Hristov Feb 18, 2024
1adde27
Merge branch 'main' into hgh/libcxx/P2495R3-Interfacing-string-stream…
H-G-Hristov Feb 19, 2024
7e0587e
Fix ALLCAPS type names
H-G-Hristov Feb 19, 2024
b07d451
Fix formatting
H-G-Hristov Feb 19, 2024
955252b
Updated: `basic_istringstream` - dynamic tests
H-G-Hristov Feb 19, 2024
cd13d55
Updated: `basic_istringstream` tests
H-G-Hristov Feb 19, 2024
132c3d5
Merge branch 'main' into hgh/libcxx/P2495R3-Interfacing-string-stream…
H-G-Hristov Feb 19, 2024
d43f5cd
Updated: `basic_ostringstream` tests
H-G-Hristov Feb 19, 2024
aa90f89
Updated: `basic_stringstream` tests
H-G-Hristov Feb 19, 2024
d963bd5
Updated: `basic_stringbuf` tests
H-G-Hristov Feb 19, 2024
b8eb086
Merge branch 'main' into hgh/libcxx/P2495R3-Interfacing-string-stream…
H-G-Hristov Feb 19, 2024
93eacb7
Minor tweaks
H-G-Hristov Feb 19, 2024
322e079
Merge branch 'main' into hgh/libcxx/P2495R3-Interfacing-string-stream…
H-G-Hristov Feb 19, 2024
6687aa3
Fix synopsis
H-G-Hristov Feb 19, 2024
dd762f8
Merge branch 'main' into hgh/libcxx/P2495R3-Interfacing-string-stream…
H-G-Hristov Mar 1, 2024
6cbaac7
Improved helper header filenames
H-G-Hristov Mar 3, 2024
2c0b4a1
One more rename
H-G-Hristov Mar 3, 2024
542ff68
Merge branch 'main' into hgh/libcxx/P2495R3-Interfacing-string-stream…
H-G-Hristov Mar 3, 2024
c290625
Fix
H-G-Hristov Mar 3, 2024
1fc00fd
More fixes
H-G-Hristov Mar 3, 2024
f1ece9b
Again
H-G-Hristov Mar 3, 2024
ea8f125
Merge branch 'main' into hgh/libcxx/P2495R3-Interfacing-string-stream…
H-G-Hristov Mar 3, 2024
28ccee0
Again
H-G-Hristov Mar 3, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion libcxx/docs/FeatureTestMacroTable.rst
Original file line number Diff line number Diff line change
Expand Up @@ -442,7 +442,7 @@ Status
--------------------------------------------------- -----------------
``__cpp_lib_span_initializer_list`` ``202311L``
--------------------------------------------------- -----------------
``__cpp_lib_sstream_from_string_view`` *unimplemented*
``__cpp_lib_sstream_from_string_view`` ``202306L``
--------------------------------------------------- -----------------
``__cpp_lib_submdspan`` *unimplemented*
--------------------------------------------------- -----------------
Expand Down
1 change: 1 addition & 0 deletions libcxx/docs/ReleaseNotes/19.rst
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ Implemented Papers
- P2637R3 - Member ``visit``
- P2652R2 - Disallow User Specialization of ``allocator_traits``
- P2819R2 - Add ``tuple`` protocol to ``complex``
- P2495R3 - Interfacing ``stringstream``s with ``string_view``
- P2302R4 - ``std::ranges::contains``
- P1659R3 - ``std::ranges::starts_with`` and ``std::ranges::ends_with``

Expand Down
2 changes: 1 addition & 1 deletion libcxx/docs/Status/Cxx2cPapers.csv
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"`P2545R4 <https://wg21.link/P2545R4>`__","LWG","Read-Copy Update (RCU)","Varna June 2023","","",""
"`P2530R3 <https://wg21.link/P2530R3>`__","LWG","Hazard Pointers for C++26","Varna June 2023","","",""
"`P2538R1 <https://wg21.link/P2538R1>`__","LWG","ADL-proof ``std::projected``","Varna June 2023","|Complete|","18.0","|ranges|"
"`P2495R3 <https://wg21.link/P2495R3>`__","LWG","Interfacing ``stringstreams`` with ``string_view``","Varna June 2023","","",""
"`P2495R3 <https://wg21.link/P2495R3>`__","LWG","Interfacing ``stringstream``s with ``string_view``","Varna June 2023","|Complete|","19.0",""
"`P2510R3 <https://wg21.link/P2510R3>`__","LWG","Formatting pointers","Varna June 2023","|Complete| [#note-P2510R3]_","17.0","|format|"
"`P2198R7 <https://wg21.link/P2198R7>`__","LWG","Freestanding Feature-Test Macros and Implementation-Defined Extensions","Varna June 2023","","",""
"`P2338R4 <https://wg21.link/P2338R4>`__","LWG","Freestanding Library: Character primitives and the C library","Varna June 2023","","",""
Expand Down
154 changes: 154 additions & 0 deletions libcxx/include/sstream
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@ public:
template <class SAlloc>
explicit basic_stringbuf(const basic_string<char_type, traits_type, SAlloc>& s,
ios_base::openmode which = ios_base::in | ios_base::out); // C++20
template<class T>
explicit basic_stringbuf(const T& t,
ios_base::openmode which = ios_base::in | ios_base::out); // Since C++26
template<class T>
basic_stringbuf(const T& t, const Allocator& a); // Since C++26
template<class T>
basic_stringbuf(const T& t, ios_base::openmode which, const Allocator& a); // Since C++26
basic_stringbuf(const basic_stringbuf&) = delete;
basic_stringbuf(basic_stringbuf&& rhs);
basic_stringbuf(basic_stringbuf&& rhs, const allocator_type& a); // C++20
Expand All @@ -69,6 +76,8 @@ public:
template <class SAlloc>
void str(const basic_string<char_type, traits_type, SAlloc>& s); // C++20
void str(basic_string<char_type, traits_type, allocator_type>&& s); // C++20
template<class T>
void str(const T& t); // Since C++26

protected:
// [stringbuf.virtuals] Overridden virtual functions:
Expand Down Expand Up @@ -121,6 +130,12 @@ public:
template <class SAlloc>
explicit basic_istringstream(const basic_string<char_type, traits_type, SAlloc>& s,
ios_base::openmode which = ios_base::in); // C++20
template<class T>
explicit basic_istringstream(const T& t, ios_base::openmode which = ios_base::in); // Since C++26
template<class T>
basic_istringstream(const T& t, const Allocator& a); // Since C++26
template<class T>
basic_istringstream(const T& t, ios_base::openmode which, const Allocator& a); // Since C++26
basic_istringstream(const basic_istringstream&) = delete;
basic_istringstream(basic_istringstream&& rhs);

Expand All @@ -141,6 +156,8 @@ public:
template <class SAlloc>
void str(const basic_string<char_type, traits_type, SAlloc>& s); // C++20
void str(basic_string<char_type, traits_type, allocator_type>&& s); // C++20
template<class T>
void str(const T& t); // Since C++26
};

template <class charT, class traits, class Allocator>
Expand Down Expand Up @@ -182,6 +199,12 @@ public:
template <class SAlloc>
explicit basic_ostringstream(const basic_string<char_type, traits_type, SAlloc>& s,
ios_base::openmode which = ios_base::out); // C++20
template<class T>
explicit basic_ostringstream(const T& t, ios_base::openmode which = ios_base::out); // Since C++26
template<class T>
basic_ostringstream(const T& t, const Allocator& a); // Since C++26
template<class T>
basic_ostringstream(const T& t, ios_base::openmode which, const Allocator& a); // Since C++26
basic_ostringstream(const basic_ostringstream&) = delete;
basic_ostringstream(basic_ostringstream&& rhs);

Expand All @@ -202,6 +225,8 @@ public:
template <class SAlloc>
void str(const basic_string<char_type, traits_type, SAlloc>& s); // C++20
void str(basic_string<char_type, traits_type, allocator_type>&& s); // C++20
template<class T>
void str(const T& t); // Since C++26
};

template <class charT, class traits, class Allocator>
Expand Down Expand Up @@ -243,6 +268,13 @@ public:
template <class SAlloc>
explicit basic_stringstream(const basic_string<char_type, traits_type, SAlloc>& s,
ios_base::openmode which = ios_base::out | ios_base::in); // C++20
template<class T>
explicit basic_stringstream(const T& t,
ios_base::openmode which = ios_base::out | ios_base::in); // Since C++26
template<class T>
basic_stringstream(const T& t, const Allocator& a); // Since C++26
template<class T>
basic_stringstream(const T& t, ios_base::openmode which, const Allocator& a); // Since C++26
basic_stringstream(const basic_stringstream&) = delete;
basic_stringstream(basic_stringstream&& rhs);

Expand All @@ -263,6 +295,8 @@ public:
template <class SAlloc>
void str(const basic_string<char_type, traits_type, SAlloc>& s); // C++20
void str(basic_string<char_type, traits_type, allocator_type>&& s); // C++20
template<class T>
void str(const T& t); // Since C++26
};

template <class charT, class traits, class Allocator>
Expand All @@ -281,10 +315,12 @@ typedef basic_stringstream<wchar_t> wstringstream;
#include <__availability>
#include <__config>
#include <__fwd/sstream.h>
#include <__type_traits/is_convertible.h>
#include <__utility/swap.h>
#include <istream>
#include <ostream>
#include <string>
#include <string_view>
#include <version>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Expand Down Expand Up @@ -371,6 +407,30 @@ public:
}
#endif // _LIBCPP_STD_VER >= 20

#if _LIBCPP_STD_VER >= 26

template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI explicit basic_stringbuf(const _Tp& __t,
ios_base::openmode __which = ios_base::in | ios_base::out)
: basic_stringbuf(__t, __which, _Allocator()) {}

template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI basic_stringbuf(const _Tp& __t, const _Allocator& __a)
: basic_stringbuf(__t, ios_base::in | ios_base::out, __a) {}

template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI basic_stringbuf(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)
: __hm_(nullptr), __mode_(__which) {
basic_string_view<_CharT, _Traits> __sv = __t;
__str_ = string_type(__sv, __a);
__init_buf_ptrs();
}

#endif // _LIBCPP_STD_VER >= 26

basic_stringbuf(const basic_stringbuf&) = delete;
basic_stringbuf(basic_stringbuf&& __rhs) : __mode_(__rhs.__mode_) { __move_init(std::move(__rhs)); }

Expand Down Expand Up @@ -444,6 +504,18 @@ public:
}
#endif // _LIBCPP_STD_VER >= 20

#if _LIBCPP_STD_VER >= 26

template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI void str(const _Tp& __t) {
basic_string_view<_CharT, _Traits> __sv = __t;
__str_ = __sv;
__init_buf_ptrs();
}

#endif // _LIBCPP_STD_VER >= 26

protected:
// [stringbuf.virtuals] Overridden virtual functions:
int_type underflow() override;
Expand Down Expand Up @@ -831,6 +903,25 @@ public:
: basic_istream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::in) {}
#endif // _LIBCPP_STD_VER >= 20

#if _LIBCPP_STD_VER >= 26

template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI explicit basic_istringstream(const _Tp& __t, ios_base::openmode __which = ios_base::in)
: basic_istringstream(__t, __which, _Allocator()) {}

template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI basic_istringstream(const _Tp& __t, const _Allocator& __a)
: basic_istringstream(__t, ios_base::in, __a) {}

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

#endif // _LIBCPP_STD_VER >= 26

basic_istringstream(const basic_istringstream&) = delete;
_LIBCPP_HIDE_FROM_ABI basic_istringstream(basic_istringstream&& __rhs)
: basic_istream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
Expand Down Expand Up @@ -882,6 +973,14 @@ public:

_LIBCPP_HIDE_FROM_ABI void str(string_type&& __s) { __sb_.str(std::move(__s)); }
#endif // _LIBCPP_STD_VER >= 20

#if _LIBCPP_STD_VER >= 26
template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI void str(const _Tp& __t) {
rdbuf()->str(__t);
}
#endif // _LIBCPP_STD_VER >= 26
};

template <class _CharT, class _Traits, class _Allocator>
Expand Down Expand Up @@ -940,6 +1039,25 @@ public:
: basic_ostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch | ios_base::out) {}
#endif // _LIBCPP_STD_VER >= 20

#if _LIBCPP_STD_VER >= 26

template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI explicit basic_ostringstream(const _Tp& __t, ios_base::openmode __which = ios_base::out)
: basic_ostringstream(__t, __which | ios_base::out, _Allocator()) {}

template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI basic_ostringstream(const _Tp& __t, const _Allocator& __a)
: basic_ostringstream(__t, ios_base::out, __a) {}

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

#endif // _LIBCPP_STD_VER >= 26

basic_ostringstream(const basic_ostringstream&) = delete;
_LIBCPP_HIDE_FROM_ABI basic_ostringstream(basic_ostringstream&& __rhs)
: basic_ostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
Expand Down Expand Up @@ -992,6 +1110,14 @@ public:

_LIBCPP_HIDE_FROM_ABI void str(string_type&& __s) { __sb_.str(std::move(__s)); }
#endif // _LIBCPP_STD_VER >= 20

#if _LIBCPP_STD_VER >= 26
template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI void str(const _Tp& __t) {
rdbuf()->str(__t);
}
#endif // _LIBCPP_STD_VER >= 26
};

template <class _CharT, class _Traits, class _Allocator>
Expand Down Expand Up @@ -1053,6 +1179,26 @@ public:
: basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__s, __wch) {}
#endif // _LIBCPP_STD_VER >= 20

#if _LIBCPP_STD_VER >= 26

template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI explicit basic_stringstream(const _Tp& __t,
ios_base::openmode __which = ios_base::out | ios_base::in)
: basic_stringstream(__t, __which, _Allocator()) {}

template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI basic_stringstream(const _Tp& __t, const _Allocator& __a)
: basic_stringstream(__t, ios_base::out | ios_base::in, __a) {}

template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI basic_stringstream(const _Tp& __t, ios_base::openmode __which, const _Allocator& __a)
: basic_iostream<_CharT, _Traits>(std::addressof(__sb_)), __sb_(__t, __which, __a) {}

#endif // _LIBCPP_STD_VER >= 26

basic_stringstream(const basic_stringstream&) = delete;
_LIBCPP_HIDE_FROM_ABI basic_stringstream(basic_stringstream&& __rhs)
: basic_iostream<_CharT, _Traits>(std::move(__rhs)), __sb_(std::move(__rhs.__sb_)) {
Expand Down Expand Up @@ -1104,6 +1250,14 @@ public:

_LIBCPP_HIDE_FROM_ABI void str(string_type&& __s) { __sb_.str(std::move(__s)); }
#endif // _LIBCPP_STD_VER >= 20

#if _LIBCPP_STD_VER >= 26
template <class _Tp>
requires is_convertible_v<const _Tp&, basic_string_view<_CharT, _Traits>>
_LIBCPP_HIDE_FROM_ABI void str(const _Tp& __t) {
rdbuf()->str(__t);
}
#endif // _LIBCPP_STD_VER >= 26
};

template <class _CharT, class _Traits, class _Allocator>
Expand Down
2 changes: 1 addition & 1 deletion libcxx/include/version
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ __cpp_lib_within_lifetime 202306L <type_traits>
// # define __cpp_lib_smart_ptr_owner_equality 202306L
# define __cpp_lib_span_at 202311L
# define __cpp_lib_span_initializer_list 202311L
// # define __cpp_lib_sstream_from_string_view 202306L
# define __cpp_lib_sstream_from_string_view 202306L
// # define __cpp_lib_submdspan 202306L
// # define __cpp_lib_text_encoding 202306L
# undef __cpp_lib_to_chars
Expand Down
1 change: 1 addition & 0 deletions libcxx/test/libcxx/transitive_includes/cxx03.csv
Original file line number Diff line number Diff line change
Expand Up @@ -745,6 +745,7 @@ sstream cstddef
sstream istream
sstream ostream
sstream string
sstream string_view
sstream type_traits
sstream version
stack compare
Expand Down
1 change: 1 addition & 0 deletions libcxx/test/libcxx/transitive_includes/cxx11.csv
Original file line number Diff line number Diff line change
Expand Up @@ -751,6 +751,7 @@ sstream cstddef
sstream istream
sstream ostream
sstream string
sstream string_view
sstream type_traits
sstream version
stack compare
Expand Down
1 change: 1 addition & 0 deletions libcxx/test/libcxx/transitive_includes/cxx14.csv
Original file line number Diff line number Diff line change
Expand Up @@ -753,6 +753,7 @@ sstream cstddef
sstream istream
sstream ostream
sstream string
sstream string_view
sstream type_traits
sstream version
stack compare
Expand Down
1 change: 1 addition & 0 deletions libcxx/test/libcxx/transitive_includes/cxx17.csv
Original file line number Diff line number Diff line change
Expand Up @@ -753,6 +753,7 @@ sstream cstddef
sstream istream
sstream ostream
sstream string
sstream string_view
sstream type_traits
sstream version
stack compare
Expand Down
1 change: 1 addition & 0 deletions libcxx/test/libcxx/transitive_includes/cxx20.csv
Original file line number Diff line number Diff line change
Expand Up @@ -758,6 +758,7 @@ sstream cstddef
sstream istream
sstream ostream
sstream string
sstream string_view
sstream type_traits
sstream version
stack compare
Expand Down
1 change: 1 addition & 0 deletions libcxx/test/libcxx/transitive_includes/cxx23.csv
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,7 @@ sstream cstddef
sstream istream
sstream ostream
sstream string
sstream string_view
sstream version
stack compare
stack cstddef
Expand Down
1 change: 1 addition & 0 deletions libcxx/test/libcxx/transitive_includes/cxx26.csv
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,7 @@ sstream cstddef
sstream istream
sstream ostream
sstream string
sstream string_view
sstream version
stack compare
stack cstddef
Expand Down
17 changes: 17 additions & 0 deletions libcxx/test/std/input.output/string.streams/helper_concepts.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef TEST_STD_INPUTOUTPUT_STRINGSTREAMS_HELPER_CONCEPTS_H
#define TEST_STD_INPUTOUTPUT_STRINGSTREAMS_HELPER_CONCEPTS_H

template <typename S, typename T>
concept is_valid_argument_for_str_member = requires(S s, const T& sv) {
{ s.str(sv) };
};

#endif // TEST_STD_INPUTOUTPUT_STRINGSTREAMS_HELPER_CONCEPTS_H
Loading