зеркало из https://github.com/microsoft/STL.git
P1989R2 Range Constructor For `string_view` (#2000)
Co-authored-by: timsong-cpp <rs2740@gmail.com> Co-authored-by: Casey Carter <cartec69@gmail.com> Co-authored-by: Stephan T. Lavavej <stl@nuwen.net>
This commit is contained in:
Родитель
61ff9e66bc
Коммит
6fe02ac09e
|
@ -1289,6 +1289,25 @@ public:
|
|||
constexpr basic_string_view(_It _First, _Se _Last) noexcept(noexcept(_Last - _First)) // strengthened
|
||||
: _Mydata(_STD to_address(_First)), _Mysize(static_cast<size_type>(_Last - _First)) {}
|
||||
// clang-format on
|
||||
|
||||
#if _HAS_CXX23
|
||||
// clang-format off
|
||||
template <_RANGES contiguous_range _Range>
|
||||
requires _RANGES sized_range<_Range>
|
||||
&& same_as<_RANGES range_value_t<_Range>, _Elem>
|
||||
&& (!is_convertible_v<_Range, const _Elem*>)
|
||||
&& (!requires(remove_cvref_t<_Range>& _Rng) {
|
||||
_Rng.operator _STD basic_string_view<_Elem, _Traits>();
|
||||
})
|
||||
&& (!requires {
|
||||
// per editorial or LWG issue not yet filed as of 2021-06-10
|
||||
typename remove_reference_t<_Range>::traits_type;
|
||||
} || same_as<typename remove_reference_t<_Range>::traits_type, _Traits>)
|
||||
constexpr basic_string_view(_Range&& _Rng) noexcept(
|
||||
noexcept(_RANGES data(_Rng)) && noexcept(_RANGES size(_Rng))) // strengthened
|
||||
: _Mydata(_RANGES data(_Rng)), _Mysize(static_cast<size_t>(_RANGES size(_Rng))) {}
|
||||
// clang-format on
|
||||
#endif // _HAS_CXX23
|
||||
#endif // __cpp_lib_concepts
|
||||
|
||||
_NODISCARD constexpr const_iterator begin() const noexcept {
|
||||
|
@ -1696,6 +1715,11 @@ private:
|
|||
template <contiguous_iterator _It, sized_sentinel_for<_It> _Se>
|
||||
basic_string_view(_It, _Se) -> basic_string_view<iter_value_t<_It>>;
|
||||
|
||||
#if _HAS_CXX23
|
||||
template <_RANGES contiguous_range _Range>
|
||||
basic_string_view(_Range&&) -> basic_string_view<_RANGES range_value_t<_Range>>;
|
||||
#endif // _HAS_CXX23
|
||||
|
||||
namespace ranges {
|
||||
template <class _Elem, class _Traits>
|
||||
inline constexpr bool enable_view<basic_string_view<_Elem, _Traits>> = true;
|
||||
|
|
|
@ -263,6 +263,7 @@
|
|||
// P1048R1 is_scoped_enum
|
||||
// P1679R3 contains() For basic_string/basic_string_view
|
||||
// P1682R3 to_underlying() For Enumerations
|
||||
// P1989R2 Range Constructor For string_view
|
||||
// P2166R1 Prohibiting basic_string And basic_string_view Construction From nullptr
|
||||
|
||||
// Parallel Algorithms Notes
|
||||
|
|
|
@ -3,12 +3,14 @@
|
|||
|
||||
#include <array>
|
||||
#include <assert.h>
|
||||
#include <deque>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
#include <stdlib.h>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <type_traits>
|
||||
#include <vector>
|
||||
|
||||
#include <constexpr_char_traits.hpp>
|
||||
|
||||
|
@ -328,6 +330,31 @@ constexpr bool test_case_contiguous_constructor() {
|
|||
return true;
|
||||
}
|
||||
|
||||
constexpr bool test_case_range_constructor() {
|
||||
#if _HAS_CXX23 && defined(__cpp_lib_concepts)
|
||||
const array expectedData{'n', 'o', ' ', 'n', 'u', 'l', 'l'};
|
||||
// Also tests the corresponding deduction guide:
|
||||
same_as<string_view> auto sv = basic_string_view(expectedData);
|
||||
assert(sv.data() == expectedData.data());
|
||||
assert(sv.size() == 7);
|
||||
|
||||
// Also tests some of the constraints:
|
||||
static_assert(is_constructible_v<string_view, vector<char>>);
|
||||
static_assert(is_convertible_v<vector<char>, string_view>);
|
||||
|
||||
static_assert(!is_constructible_v<string_view, deque<char>>); // not contiguous
|
||||
static_assert(!is_convertible_v<deque<char>, string_view>);
|
||||
|
||||
static_assert(!is_constructible_v<string_view, vector<unsigned char>>); // different elements
|
||||
static_assert(!is_convertible_v<vector<unsigned char>, string_view>);
|
||||
|
||||
static_assert(!is_constructible_v<string_view, basic_string<char, constexpr_char_traits>>); // different traits
|
||||
static_assert(!is_convertible_v<basic_string<char, constexpr_char_traits>, string_view>);
|
||||
#endif // _HAS_CXX23 && defined(__cpp_lib_concepts)
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
template <class CharT, class Traits>
|
||||
constexpr bool test_case_iterators() {
|
||||
using iterator = typename basic_string_view<CharT, Traits>::iterator;
|
||||
|
@ -1162,6 +1189,7 @@ static_assert(test_case_default_constructor());
|
|||
static_assert(test_case_ntcts_constructor<constexpr_char_traits>());
|
||||
static_assert(test_case_buffer_constructor());
|
||||
static_assert(test_case_contiguous_constructor());
|
||||
static_assert(test_case_range_constructor());
|
||||
#if defined(__clang__) || defined(__EDG__) // TRANSITION, VSO-284079 "C1XX's C++14 constexpr emits bogus warnings C4146,
|
||||
// C4308, C4307 for basic_string_view::iterator"
|
||||
static_assert(test_case_iterators<char, constexpr_char_traits>());
|
||||
|
@ -1217,6 +1245,7 @@ int main() {
|
|||
test_case_ntcts_constructor();
|
||||
test_case_buffer_constructor();
|
||||
test_case_contiguous_constructor();
|
||||
test_case_range_constructor();
|
||||
test_case_iterators<char, char_traits<char>>();
|
||||
test_case_iterators<wchar_t, char_traits<wchar_t>>();
|
||||
test_case_prefix<char, char_traits<char>>();
|
||||
|
|
Загрузка…
Ссылка в новой задаче