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:
Sam Huang 2021-06-29 15:47:32 -07:00 коммит произвёл GitHub
Родитель 61ff9e66bc
Коммит 6fe02ac09e
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 54 добавлений и 0 удалений

Просмотреть файл

@ -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>>();