diff options
Diffstat (limited to 'libcxx/include/string_view')
-rw-r--r-- | libcxx/include/string_view | 1135 |
1 files changed, 509 insertions, 626 deletions
diff --git a/libcxx/include/string_view b/libcxx/include/string_view index 3712584..909224f 100644 --- a/libcxx/include/string_view +++ b/libcxx/include/string_view @@ -255,505 +255,421 @@ namespace std { _LIBCPP_PUSH_MACROS #include <__undef_macros> - _LIBCPP_BEGIN_NAMESPACE_STD // TODO: This is a workaround for some vendors to carry a downstream diff to accept `nullptr` in // string_view constructors. This can be refactored when this exact form isn't needed anymore. template <class _Traits> -_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR -inline size_t __char_traits_length_checked(const typename _Traits::char_type* __s) _NOEXCEPT { +_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR inline size_t +__char_traits_length_checked(const typename _Traits::char_type* __s) _NOEXCEPT { // This needs to be a single statement for C++11 constexpr return _LIBCPP_ASSERT_NON_NULL( __s != nullptr, "null pointer passed to non-null argument of char_traits<...>::length"), _Traits::length(__s); } -template<class _CharT, class _Traits> +template <class _CharT, class _Traits> class basic_string_view { public: - // types - using traits_type = _Traits; - using value_type = _CharT; - using pointer = _CharT*; - using const_pointer = const _CharT*; - using reference = _CharT&; - using const_reference = const _CharT&; + // types + using traits_type = _Traits; + using value_type = _CharT; + using pointer = _CharT*; + using const_pointer = const _CharT*; + using reference = _CharT&; + using const_reference = const _CharT&; #ifdef _LIBCPP_ABI_BOUNDED_ITERATORS - using const_iterator = __bounded_iter<const_pointer>; + using const_iterator = __bounded_iter<const_pointer>; #else - using const_iterator = const_pointer; // See [string.view.iterators] + using const_iterator = const_pointer; // See [string.view.iterators] #endif - using iterator = const_iterator; - using const_reverse_iterator = std::reverse_iterator<const_iterator>; - using reverse_iterator = const_reverse_iterator; - using size_type = size_t; - using difference_type = ptrdiff_t; - static _LIBCPP_CONSTEXPR const size_type npos = -1; // size_type(-1); - - static_assert((!is_array<value_type>::value), "Character type of basic_string_view must not be an array"); - static_assert(( is_standard_layout<value_type>::value), "Character type of basic_string_view must be standard-layout"); - static_assert(( is_trivial<value_type>::value), "Character type of basic_string_view must be trivial"); - static_assert((is_same<_CharT, typename traits_type::char_type>::value), - "traits_type::char_type must be the same type as CharT"); - - // [string.view.cons], construct/copy - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - basic_string_view() _NOEXCEPT : __data_(nullptr), __size_(0) {} - - _LIBCPP_HIDE_FROM_ABI - basic_string_view(const basic_string_view&) _NOEXCEPT = default; - - _LIBCPP_HIDE_FROM_ABI - basic_string_view& operator=(const basic_string_view&) _NOEXCEPT = default; - - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - basic_string_view(const _CharT* __s, size_type __len) _NOEXCEPT - : __data_(__s), __size_(__len) - { + using iterator = const_iterator; + using const_reverse_iterator = std::reverse_iterator<const_iterator>; + using reverse_iterator = const_reverse_iterator; + using size_type = size_t; + using difference_type = ptrdiff_t; + static _LIBCPP_CONSTEXPR const size_type npos = -1; // size_type(-1); + + static_assert((!is_array<value_type>::value), "Character type of basic_string_view must not be an array"); + static_assert((is_standard_layout<value_type>::value), "Character type of basic_string_view must be standard-layout"); + static_assert((is_trivial<value_type>::value), "Character type of basic_string_view must be trivial"); + static_assert((is_same<_CharT, typename traits_type::char_type>::value), + "traits_type::char_type must be the same type as CharT"); + + // [string.view.cons], construct/copy + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI basic_string_view() _NOEXCEPT : __data_(nullptr), __size_(0) {} + + _LIBCPP_HIDE_FROM_ABI basic_string_view(const basic_string_view&) _NOEXCEPT = default; + + _LIBCPP_HIDE_FROM_ABI basic_string_view& operator=(const basic_string_view&) _NOEXCEPT = default; + + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI basic_string_view(const _CharT* __s, size_type __len) _NOEXCEPT + : __data_(__s), + __size_(__len) { #if _LIBCPP_STD_VER >= 14 - _LIBCPP_ASSERT_UNCATEGORIZED( - __len <= static_cast<size_type>(numeric_limits<difference_type>::max()), - "string_view::string_view(_CharT *, size_t): length does not fit in difference_type"); + _LIBCPP_ASSERT_UNCATEGORIZED(__len <= static_cast<size_type>(numeric_limits<difference_type>::max()), + "string_view::string_view(_CharT *, size_t): length does not fit in difference_type"); _LIBCPP_ASSERT_NON_NULL( __len == 0 || __s != nullptr, "string_view::string_view(_CharT *, size_t): received nullptr"); #endif - } + } #if _LIBCPP_STD_VER >= 20 - template <contiguous_iterator _It, sized_sentinel_for<_It> _End> - requires (is_same_v<iter_value_t<_It>, _CharT> && !is_convertible_v<_End, size_type>) - constexpr _LIBCPP_HIDE_FROM_ABI basic_string_view(_It __begin, _End __end) - : __data_(std::to_address(__begin)), __size_(__end - __begin) - { - _LIBCPP_ASSERT_VALID_INPUT_RANGE((__end - __begin) >= 0, - "std::string_view::string_view(iterator, sentinel) received invalid range"); - } + template <contiguous_iterator _It, sized_sentinel_for<_It> _End> + requires(is_same_v<iter_value_t<_It>, _CharT> && !is_convertible_v<_End, size_type>) + constexpr _LIBCPP_HIDE_FROM_ABI basic_string_view(_It __begin, _End __end) + : __data_(std::to_address(__begin)), __size_(__end - __begin) { + _LIBCPP_ASSERT_VALID_INPUT_RANGE( + (__end - __begin) >= 0, "std::string_view::string_view(iterator, sentinel) received invalid range"); + } #endif // _LIBCPP_STD_VER >= 20 #if _LIBCPP_STD_VER >= 23 - template <class _Range> - requires ( - !is_same_v<remove_cvref_t<_Range>, basic_string_view> && - ranges::contiguous_range<_Range> && - ranges::sized_range<_Range> && - is_same_v<ranges::range_value_t<_Range>, _CharT> && - !is_convertible_v<_Range, const _CharT*> && - (!requires(remove_cvref_t<_Range>& __d) { - __d.operator std::basic_string_view<_CharT, _Traits>(); - }) - ) - constexpr explicit _LIBCPP_HIDE_FROM_ABI - basic_string_view(_Range&& __r) : __data_(ranges::data(__r)), __size_(ranges::size(__r)) {} + template <class _Range> + requires(!is_same_v<remove_cvref_t<_Range>, basic_string_view> && ranges::contiguous_range<_Range> && + ranges::sized_range<_Range> && is_same_v<ranges::range_value_t<_Range>, _CharT> && + !is_convertible_v<_Range, const _CharT*> && + (!requires(remove_cvref_t<_Range>& __d) { __d.operator std::basic_string_view<_CharT, _Traits>(); })) + constexpr explicit _LIBCPP_HIDE_FROM_ABI basic_string_view(_Range&& __r) + : __data_(ranges::data(__r)), __size_(ranges::size(__r)) {} #endif // _LIBCPP_STD_VER >= 23 - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - basic_string_view(const _CharT* __s) - : __data_(__s), __size_(std::__char_traits_length_checked<_Traits>(__s)) {} + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI basic_string_view(const _CharT* __s) + : __data_(__s), __size_(std::__char_traits_length_checked<_Traits>(__s)) {} #if _LIBCPP_STD_VER >= 23 - basic_string_view(nullptr_t) = delete; + basic_string_view(nullptr_t) = delete; #endif - // [string.view.iterators], iterators - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - const_iterator begin() const _NOEXCEPT { return cbegin(); } + // [string.view.iterators], iterators + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI const_iterator begin() const _NOEXCEPT { return cbegin(); } - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - const_iterator end() const _NOEXCEPT { return cend(); } + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI const_iterator end() const _NOEXCEPT { return cend(); } - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - const_iterator cbegin() const _NOEXCEPT { + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI const_iterator cbegin() const _NOEXCEPT { #ifdef _LIBCPP_ABI_BOUNDED_ITERATORS - return std::__make_bounded_iter(data(), data(), data() + size()); + return std::__make_bounded_iter(data(), data(), data() + size()); #else - return __data_; + return __data_; #endif - } + } - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - const_iterator cend() const _NOEXCEPT { + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI const_iterator cend() const _NOEXCEPT { #ifdef _LIBCPP_ABI_BOUNDED_ITERATORS - return std::__make_bounded_iter(data() + size(), data(), data() + size()); + return std::__make_bounded_iter(data() + size(), data(), data() + size()); #else - return __data_ + __size_; + return __data_ + __size_; #endif - } - - _LIBCPP_CONSTEXPR_SINCE_CXX17 _LIBCPP_HIDE_FROM_ABI - const_reverse_iterator rbegin() const _NOEXCEPT { return const_reverse_iterator(cend()); } - - _LIBCPP_CONSTEXPR_SINCE_CXX17 _LIBCPP_HIDE_FROM_ABI - const_reverse_iterator rend() const _NOEXCEPT { return const_reverse_iterator(cbegin()); } - - _LIBCPP_CONSTEXPR_SINCE_CXX17 _LIBCPP_HIDE_FROM_ABI - const_reverse_iterator crbegin() const _NOEXCEPT { return const_reverse_iterator(cend()); } - - _LIBCPP_CONSTEXPR_SINCE_CXX17 _LIBCPP_HIDE_FROM_ABI - const_reverse_iterator crend() const _NOEXCEPT { return const_reverse_iterator(cbegin()); } - - // [string.view.capacity], capacity - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - size_type size() const _NOEXCEPT { return __size_; } - - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - size_type length() const _NOEXCEPT { return __size_; } - - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - size_type max_size() const _NOEXCEPT { return numeric_limits<size_type>::max() / sizeof(value_type); } - - _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR - bool empty() const _NOEXCEPT { return __size_ == 0; } - - // [string.view.access], element access - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - const_reference operator[](size_type __pos) const _NOEXCEPT { - return _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__pos < size(), "string_view[] index out of bounds"), __data_[__pos]; - } - - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - const_reference at(size_type __pos) const - { - return __pos >= size() - ? (__throw_out_of_range("string_view::at"), __data_[0]) - : __data_[__pos]; - } - - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - const_reference front() const _NOEXCEPT - { - return _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "string_view::front(): string is empty"), __data_[0]; - } - - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - const_reference back() const _NOEXCEPT - { - return _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "string_view::back(): string is empty"), - __data_[__size_ - 1]; - } - - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - const_pointer data() const _NOEXCEPT { return __data_; } - - // [string.view.modifiers], modifiers: - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - void remove_prefix(size_type __n) _NOEXCEPT - { - _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n <= size(), "remove_prefix() can't remove more than size()"); - __data_ += __n; - __size_ -= __n; - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - void remove_suffix(size_type __n) _NOEXCEPT - { - _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n <= size(), "remove_suffix() can't remove more than size()"); - __size_ -= __n; - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - void swap(basic_string_view& __other) _NOEXCEPT - { - const value_type *__p = __data_; - __data_ = __other.__data_; - __other.__data_ = __p; - - size_type __sz = __size_; - __size_ = __other.__size_; - __other.__size_ = __sz; - } - - _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 - size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const - { - if (__pos > size()) - __throw_out_of_range("string_view::copy"); - size_type __rlen = std::min(__n, size() - __pos); - _Traits::copy(__s, data() + __pos, __rlen); - return __rlen; - } - - _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI - basic_string_view substr(size_type __pos = 0, size_type __n = npos) const - { - return __pos > size() - ? (__throw_out_of_range("string_view::substr"), basic_string_view()) - : basic_string_view(data() + __pos, std::min(__n, size() - __pos)); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 int compare(basic_string_view __sv) const _NOEXCEPT - { - size_type __rlen = std::min(size(), __sv.size()); - int __retval = _Traits::compare(data(), __sv.data(), __rlen); - if (__retval == 0) // first __rlen chars matched - __retval = size() == __sv.size() ? 0 : (size() < __sv.size() ? -1 : 1); - return __retval; - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - int compare(size_type __pos1, size_type __n1, basic_string_view __sv) const - { - return substr(__pos1, __n1).compare(__sv); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - int compare( size_type __pos1, size_type __n1, - basic_string_view __sv, size_type __pos2, size_type __n2) const - { - return substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2)); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - int compare(const _CharT* __s) const _NOEXCEPT - { - return compare(basic_string_view(__s)); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - int compare(size_type __pos1, size_type __n1, const _CharT* __s) const - { - return substr(__pos1, __n1).compare(basic_string_view(__s)); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - int compare(size_type __pos1, size_type __n1, const _CharT* __s, size_type __n2) const - { - return substr(__pos1, __n1).compare(basic_string_view(__s, __n2)); - } - - // find - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr"); - return std::__str_find<value_type, size_type, traits_type, npos> - (data(), size(), __s.data(), __pos, __s.size()); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find(_CharT __c, size_type __pos = 0) const _NOEXCEPT - { - return std::__str_find<value_type, size_type, traits_type, npos> - (data(), size(), __c, __pos); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::find(): received nullptr"); - return std::__str_find<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, __n); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find(const _CharT* __s, size_type __pos = 0) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::find(): received nullptr"); - return std::__str_find<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, traits_type::length(__s)); - } - - // rfind - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type rfind(basic_string_view __s, size_type __pos = npos) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr"); - return std::__str_rfind<value_type, size_type, traits_type, npos> - (data(), size(), __s.data(), __pos, __s.size()); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type rfind(_CharT __c, size_type __pos = npos) const _NOEXCEPT - { - return std::__str_rfind<value_type, size_type, traits_type, npos> - (data(), size(), __c, __pos); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::rfind(): received nullptr"); - return std::__str_rfind<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, __n); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type rfind(const _CharT* __s, size_type __pos=npos) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::rfind(): received nullptr"); - return std::__str_rfind<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, traits_type::length(__s)); - } - - // find_first_of - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_first_of(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL( - __s.size() == 0 || __s.data() != nullptr, "string_view::find_first_of(): received nullptr"); - return std::__str_find_first_of<value_type, size_type, traits_type, npos> - (data(), size(), __s.data(), __pos, __s.size()); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_first_of(_CharT __c, size_type __pos = 0) const _NOEXCEPT - { return find(__c, __pos); } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::find_first_of(): received nullptr"); - return std::__str_find_first_of<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, __n); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_first_of(const _CharT* __s, size_type __pos=0) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::find_first_of(): received nullptr"); - return std::__str_find_first_of<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, traits_type::length(__s)); - } - - // find_last_of - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_last_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL( - __s.size() == 0 || __s.data() != nullptr, "string_view::find_last_of(): received nullptr"); - return std::__str_find_last_of<value_type, size_type, traits_type, npos> - (data(), size(), __s.data(), __pos, __s.size()); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_last_of(_CharT __c, size_type __pos = npos) const _NOEXCEPT - { return rfind(__c, __pos); } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::find_last_of(): received nullptr"); - return std::__str_find_last_of<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, __n); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_last_of(const _CharT* __s, size_type __pos=npos) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::find_last_of(): received nullptr"); - return std::__str_find_last_of<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, traits_type::length(__s)); - } - - // find_first_not_of - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_first_not_of(basic_string_view __s, size_type __pos=0) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL( - __s.size() == 0 || __s.data() != nullptr, "string_view::find_first_not_of(): received nullptr"); - return std::__str_find_first_not_of<value_type, size_type, traits_type, npos> - (data(), size(), __s.data(), __pos, __s.size()); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_first_not_of(_CharT __c, size_type __pos=0) const _NOEXCEPT - { - return std::__str_find_first_not_of<value_type, size_type, traits_type, npos> - (data(), size(), __c, __pos); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::find_first_not_of(): received nullptr"); - return std::__str_find_first_not_of<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, __n); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_first_not_of(const _CharT* __s, size_type __pos=0) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::find_first_not_of(): received nullptr"); - return std::__str_find_first_not_of<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, traits_type::length(__s)); - } - - // find_last_not_of - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_last_not_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL( - __s.size() == 0 || __s.data() != nullptr, "string_view::find_last_not_of(): received nullptr"); - return std::__str_find_last_not_of<value_type, size_type, traits_type, npos> - (data(), size(), __s.data(), __pos, __s.size()); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_last_not_of(_CharT __c, size_type __pos=npos) const _NOEXCEPT - { - return std::__str_find_last_not_of<value_type, size_type, traits_type, npos> - (data(), size(), __c, __pos); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::find_last_not_of(): received nullptr"); - return std::__str_find_last_not_of<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, __n); - } - - _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI - size_type find_last_not_of(const _CharT* __s, size_type __pos=npos) const _NOEXCEPT - { - _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::find_last_not_of(): received nullptr"); - return std::__str_find_last_not_of<value_type, size_type, traits_type, npos> - (data(), size(), __s, __pos, traits_type::length(__s)); - } + } + + _LIBCPP_CONSTEXPR_SINCE_CXX17 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator rbegin() const _NOEXCEPT { + return const_reverse_iterator(cend()); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX17 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator rend() const _NOEXCEPT { + return const_reverse_iterator(cbegin()); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX17 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator crbegin() const _NOEXCEPT { + return const_reverse_iterator(cend()); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX17 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator crend() const _NOEXCEPT { + return const_reverse_iterator(cbegin()); + } + + // [string.view.capacity], capacity + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI size_type size() const _NOEXCEPT { return __size_; } + + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI size_type length() const _NOEXCEPT { return __size_; } + + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI size_type max_size() const _NOEXCEPT { + return numeric_limits<size_type>::max() / sizeof(value_type); + } + + _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR bool empty() const _NOEXCEPT { + return __size_ == 0; + } + + // [string.view.access], element access + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI const_reference operator[](size_type __pos) const _NOEXCEPT { + return _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__pos < size(), "string_view[] index out of bounds"), __data_[__pos]; + } + + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI const_reference at(size_type __pos) const { + return __pos >= size() ? (__throw_out_of_range("string_view::at"), __data_[0]) : __data_[__pos]; + } + + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI const_reference front() const _NOEXCEPT { + return _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "string_view::front(): string is empty"), __data_[0]; + } + + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI const_reference back() const _NOEXCEPT { + return _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "string_view::back(): string is empty"), __data_[__size_ - 1]; + } + + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI const_pointer data() const _NOEXCEPT { return __data_; } + + // [string.view.modifiers], modifiers: + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI void remove_prefix(size_type __n) _NOEXCEPT { + _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n <= size(), "remove_prefix() can't remove more than size()"); + __data_ += __n; + __size_ -= __n; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI void remove_suffix(size_type __n) _NOEXCEPT { + _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n <= size(), "remove_suffix() can't remove more than size()"); + __size_ -= __n; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI void swap(basic_string_view& __other) _NOEXCEPT { + const value_type* __p = __data_; + __data_ = __other.__data_; + __other.__data_ = __p; + + size_type __sz = __size_; + __size_ = __other.__size_; + __other.__size_ = __sz; + } + + _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type + copy(_CharT* __s, size_type __n, size_type __pos = 0) const { + if (__pos > size()) + __throw_out_of_range("string_view::copy"); + size_type __rlen = std::min(__n, size() - __pos); + _Traits::copy(__s, data() + __pos, __rlen); + return __rlen; + } + + _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI basic_string_view substr(size_type __pos = 0, size_type __n = npos) const { + return __pos > size() ? (__throw_out_of_range("string_view::substr"), basic_string_view()) + : basic_string_view(data() + __pos, std::min(__n, size() - __pos)); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 int compare(basic_string_view __sv) const _NOEXCEPT { + size_type __rlen = std::min(size(), __sv.size()); + int __retval = _Traits::compare(data(), __sv.data(), __rlen); + if (__retval == 0) // first __rlen chars matched + __retval = size() == __sv.size() ? 0 : (size() < __sv.size() ? -1 : 1); + return __retval; + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI int + compare(size_type __pos1, size_type __n1, basic_string_view __sv) const { + return substr(__pos1, __n1).compare(__sv); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI int + compare(size_type __pos1, size_type __n1, basic_string_view __sv, size_type __pos2, size_type __n2) const { + return substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2)); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI int compare(const _CharT* __s) const _NOEXCEPT { + return compare(basic_string_view(__s)); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI int + compare(size_type __pos1, size_type __n1, const _CharT* __s) const { + return substr(__pos1, __n1).compare(basic_string_view(__s)); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI int + compare(size_type __pos1, size_type __n1, const _CharT* __s, size_type __n2) const { + return substr(__pos1, __n1).compare(basic_string_view(__s, __n2)); + } + + // find + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr"); + return std::__str_find<value_type, size_type, traits_type, npos>(data(), size(), __s.data(), __pos, __s.size()); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type find(_CharT __c, size_type __pos = 0) const _NOEXCEPT { + return std::__str_find<value_type, size_type, traits_type, npos>(data(), size(), __c, __pos); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::find(): received nullptr"); + return std::__str_find<value_type, size_type, traits_type, npos>(data(), size(), __s, __pos, __n); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find(const _CharT* __s, size_type __pos = 0) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::find(): received nullptr"); + return std::__str_find<value_type, size_type, traits_type, npos>( + data(), size(), __s, __pos, traits_type::length(__s)); + } + + // rfind + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + rfind(basic_string_view __s, size_type __pos = npos) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr"); + return std::__str_rfind<value_type, size_type, traits_type, npos>(data(), size(), __s.data(), __pos, __s.size()); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + rfind(_CharT __c, size_type __pos = npos) const _NOEXCEPT { + return std::__str_rfind<value_type, size_type, traits_type, npos>(data(), size(), __c, __pos); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + rfind(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::rfind(): received nullptr"); + return std::__str_rfind<value_type, size_type, traits_type, npos>(data(), size(), __s, __pos, __n); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + rfind(const _CharT* __s, size_type __pos = npos) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::rfind(): received nullptr"); + return std::__str_rfind<value_type, size_type, traits_type, npos>( + data(), size(), __s, __pos, traits_type::length(__s)); + } + + // find_first_of + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_first_of(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_of(): received nullptr"); + return std::__str_find_first_of<value_type, size_type, traits_type, npos>( + data(), size(), __s.data(), __pos, __s.size()); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_first_of(_CharT __c, size_type __pos = 0) const _NOEXCEPT { + return find(__c, __pos); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_first_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::find_first_of(): received nullptr"); + return std::__str_find_first_of<value_type, size_type, traits_type, npos>(data(), size(), __s, __pos, __n); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_first_of(const _CharT* __s, size_type __pos = 0) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::find_first_of(): received nullptr"); + return std::__str_find_first_of<value_type, size_type, traits_type, npos>( + data(), size(), __s, __pos, traits_type::length(__s)); + } + + // find_last_of + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_last_of(basic_string_view __s, size_type __pos = npos) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_of(): received nullptr"); + return std::__str_find_last_of<value_type, size_type, traits_type, npos>( + data(), size(), __s.data(), __pos, __s.size()); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_last_of(_CharT __c, size_type __pos = npos) const _NOEXCEPT { + return rfind(__c, __pos); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_last_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::find_last_of(): received nullptr"); + return std::__str_find_last_of<value_type, size_type, traits_type, npos>(data(), size(), __s, __pos, __n); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_last_of(const _CharT* __s, size_type __pos = npos) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::find_last_of(): received nullptr"); + return std::__str_find_last_of<value_type, size_type, traits_type, npos>( + data(), size(), __s, __pos, traits_type::length(__s)); + } + + // find_first_not_of + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_first_not_of(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL( + __s.size() == 0 || __s.data() != nullptr, "string_view::find_first_not_of(): received nullptr"); + return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>( + data(), size(), __s.data(), __pos, __s.size()); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_first_not_of(_CharT __c, size_type __pos = 0) const _NOEXCEPT { + return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>(data(), size(), __c, __pos); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::find_first_not_of(): received nullptr"); + return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>(data(), size(), __s, __pos, __n); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_first_not_of(const _CharT* __s, size_type __pos = 0) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::find_first_not_of(): received nullptr"); + return std::__str_find_first_not_of<value_type, size_type, traits_type, npos>( + data(), size(), __s, __pos, traits_type::length(__s)); + } + + // find_last_not_of + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_last_not_of(basic_string_view __s, size_type __pos = npos) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL( + __s.size() == 0 || __s.data() != nullptr, "string_view::find_last_not_of(): received nullptr"); + return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>( + data(), size(), __s.data(), __pos, __s.size()); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_last_not_of(_CharT __c, size_type __pos = npos) const _NOEXCEPT { + return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>(data(), size(), __c, __pos); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__n == 0 || __s != nullptr, "string_view::find_last_not_of(): received nullptr"); + return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>(data(), size(), __s, __pos, __n); + } + + _LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI size_type + find_last_not_of(const _CharT* __s, size_type __pos = npos) const _NOEXCEPT { + _LIBCPP_ASSERT_NON_NULL(__s != nullptr, "string_view::find_last_not_of(): received nullptr"); + return std::__str_find_last_not_of<value_type, size_type, traits_type, npos>( + data(), size(), __s, __pos, traits_type::length(__s)); + } #if _LIBCPP_STD_VER >= 20 - constexpr _LIBCPP_HIDE_FROM_ABI - bool starts_with(basic_string_view __s) const noexcept - { return size() >= __s.size() && compare(0, __s.size(), __s) == 0; } + constexpr _LIBCPP_HIDE_FROM_ABI bool starts_with(basic_string_view __s) const noexcept { + return size() >= __s.size() && compare(0, __s.size(), __s) == 0; + } - constexpr _LIBCPP_HIDE_FROM_ABI - bool starts_with(value_type __c) const noexcept - { return !empty() && _Traits::eq(front(), __c); } + constexpr _LIBCPP_HIDE_FROM_ABI bool starts_with(value_type __c) const noexcept { + return !empty() && _Traits::eq(front(), __c); + } - constexpr _LIBCPP_HIDE_FROM_ABI - bool starts_with(const value_type* __s) const noexcept - { return starts_with(basic_string_view(__s)); } + constexpr _LIBCPP_HIDE_FROM_ABI bool starts_with(const value_type* __s) const noexcept { + return starts_with(basic_string_view(__s)); + } - constexpr _LIBCPP_HIDE_FROM_ABI - bool ends_with(basic_string_view __s) const noexcept - { return size() >= __s.size() && compare(size() - __s.size(), npos, __s) == 0; } + constexpr _LIBCPP_HIDE_FROM_ABI bool ends_with(basic_string_view __s) const noexcept { + return size() >= __s.size() && compare(size() - __s.size(), npos, __s) == 0; + } - constexpr _LIBCPP_HIDE_FROM_ABI - bool ends_with(value_type __c) const noexcept - { return !empty() && _Traits::eq(back(), __c); } + constexpr _LIBCPP_HIDE_FROM_ABI bool ends_with(value_type __c) const noexcept { + return !empty() && _Traits::eq(back(), __c); + } - constexpr _LIBCPP_HIDE_FROM_ABI - bool ends_with(const value_type* __s) const noexcept - { return ends_with(basic_string_view(__s)); } + constexpr _LIBCPP_HIDE_FROM_ABI bool ends_with(const value_type* __s) const noexcept { + return ends_with(basic_string_view(__s)); + } #endif #if _LIBCPP_STD_VER >= 23 - constexpr _LIBCPP_HIDE_FROM_ABI - bool contains(basic_string_view __sv) const noexcept - { return find(__sv) != npos; } + constexpr _LIBCPP_HIDE_FROM_ABI bool contains(basic_string_view __sv) const noexcept { return find(__sv) != npos; } - constexpr _LIBCPP_HIDE_FROM_ABI - bool contains(value_type __c) const noexcept - { return find(__c) != npos; } + constexpr _LIBCPP_HIDE_FROM_ABI bool contains(value_type __c) const noexcept { return find(__c) != npos; } - constexpr _LIBCPP_HIDE_FROM_ABI - bool contains(const value_type* __s) const - { return find(__s) != npos; } + constexpr _LIBCPP_HIDE_FROM_ABI bool contains(const value_type* __s) const { return find(__s) != npos; } #endif private: - const value_type* __data_; - size_type __size_; + const value_type* __data_; + size_type __size_; }; _LIBCPP_CTAD_SUPPORTED_FOR_TYPE(basic_string_view); @@ -769,220 +685,194 @@ inline constexpr bool ranges::enable_borrowed_range<basic_string_view<_CharT, _T #if _LIBCPP_STD_VER >= 20 template <contiguous_iterator _It, sized_sentinel_for<_It> _End> - basic_string_view(_It, _End) -> basic_string_view<iter_value_t<_It>>; +basic_string_view(_It, _End) -> basic_string_view<iter_value_t<_It>>; #endif // _LIBCPP_STD_VER >= 20 - #if _LIBCPP_STD_VER >= 23 template <ranges::contiguous_range _Range> - basic_string_view(_Range) -> basic_string_view<ranges::range_value_t<_Range>>; +basic_string_view(_Range) -> basic_string_view<ranges::range_value_t<_Range>>; #endif // [string.view.comparison] #if _LIBCPP_STD_VER >= 20 -template<class _CharT, class _Traits> -_LIBCPP_HIDE_FROM_ABI constexpr -bool operator==(basic_string_view<_CharT, _Traits> __lhs, - type_identity_t<basic_string_view<_CharT, _Traits>> __rhs) noexcept { - if (__lhs.size() != __rhs.size()) return false; - return __lhs.compare(__rhs) == 0; +template <class _CharT, class _Traits> +_LIBCPP_HIDE_FROM_ABI constexpr bool operator==(basic_string_view<_CharT, _Traits> __lhs, + type_identity_t<basic_string_view<_CharT, _Traits>> __rhs) noexcept { + if (__lhs.size() != __rhs.size()) + return false; + return __lhs.compare(__rhs) == 0; } template <class _CharT, class _Traits> -_LIBCPP_HIDE_FROM_ABI constexpr auto operator<=>( - basic_string_view<_CharT, _Traits> __lhs, type_identity_t<basic_string_view<_CharT, _Traits>> __rhs) noexcept { - if constexpr (requires { typename _Traits::comparison_category; }) { - // [string.view]/4 - static_assert( - __comparison_category<typename _Traits::comparison_category>, - "return type is not a comparison category type"); - return static_cast<typename _Traits::comparison_category>(__lhs.compare(__rhs) <=> 0); - } else { - return static_cast<weak_ordering>(__lhs.compare(__rhs) <=> 0); - } +_LIBCPP_HIDE_FROM_ABI constexpr auto operator<=>(basic_string_view<_CharT, _Traits> __lhs, + type_identity_t<basic_string_view<_CharT, _Traits>> __rhs) noexcept { + if constexpr (requires { typename _Traits::comparison_category; }) { + // [string.view]/4 + static_assert( + __comparison_category<typename _Traits::comparison_category>, "return type is not a comparison category type"); + return static_cast<typename _Traits::comparison_category>(__lhs.compare(__rhs) <=> 0); + } else { + return static_cast<weak_ordering>(__lhs.compare(__rhs) <=> 0); + } } #else // operator == -template<class _CharT, class _Traits> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator==(basic_string_view<_CharT, _Traits> __lhs, - basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - if (__lhs.size() != __rhs.size()) return false; - return __lhs.compare(__rhs) == 0; +template <class _CharT, class _Traits> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator==(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + if (__lhs.size() != __rhs.size()) + return false; + return __lhs.compare(__rhs) == 0; } // The dummy default template parameters are used to work around a MSVC issue with mangling, see VSO-409326 for details. // This applies to the other sufficient overloads below for the other comparison operators. -template<class _CharT, class _Traits, int = 1> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator==(basic_string_view<_CharT, _Traits> __lhs, - __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT -{ - if (__lhs.size() != __rhs.size()) return false; - return __lhs.compare(__rhs) == 0; +template <class _CharT, class _Traits, int = 1> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator==(basic_string_view<_CharT, _Traits> __lhs, + __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT { + if (__lhs.size() != __rhs.size()) + return false; + return __lhs.compare(__rhs) == 0; } -template<class _CharT, class _Traits, int = 2> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator==(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, - basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - if (__lhs.size() != __rhs.size()) return false; - return __lhs.compare(__rhs) == 0; +template <class _CharT, class _Traits, int = 2> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator==(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, + basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + if (__lhs.size() != __rhs.size()) + return false; + return __lhs.compare(__rhs) == 0; } // operator != -template<class _CharT, class _Traits> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator!=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - if (__lhs.size() != __rhs.size()) - return true; - return __lhs.compare(__rhs) != 0; +template <class _CharT, class _Traits> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator!=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + if (__lhs.size() != __rhs.size()) + return true; + return __lhs.compare(__rhs) != 0; } -template<class _CharT, class _Traits, int = 1> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator!=(basic_string_view<_CharT, _Traits> __lhs, - __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT -{ - if (__lhs.size() != __rhs.size()) - return true; - return __lhs.compare(__rhs) != 0; +template <class _CharT, class _Traits, int = 1> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator!=(basic_string_view<_CharT, _Traits> __lhs, + __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT { + if (__lhs.size() != __rhs.size()) + return true; + return __lhs.compare(__rhs) != 0; } -template<class _CharT, class _Traits, int = 2> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator!=(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, - basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - if (__lhs.size() != __rhs.size()) - return true; - return __lhs.compare(__rhs) != 0; +template <class _CharT, class _Traits, int = 2> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator!=(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, + basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + if (__lhs.size() != __rhs.size()) + return true; + return __lhs.compare(__rhs) != 0; } - // operator < -template<class _CharT, class _Traits> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator<(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) < 0; +template <class _CharT, class _Traits> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator<(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) < 0; } -template<class _CharT, class _Traits, int = 1> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator<(basic_string_view<_CharT, _Traits> __lhs, - __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) < 0; +template <class _CharT, class _Traits, int = 1> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator<(basic_string_view<_CharT, _Traits> __lhs, + __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) < 0; } -template<class _CharT, class _Traits, int = 2> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator<(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, - basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) < 0; +template <class _CharT, class _Traits, int = 2> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator<(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, + basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) < 0; } - // operator > -template<class _CharT, class _Traits> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator> (basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) > 0; +template <class _CharT, class _Traits> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator>(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) > 0; } -template<class _CharT, class _Traits, int = 1> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator>(basic_string_view<_CharT, _Traits> __lhs, - __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) > 0; +template <class _CharT, class _Traits, int = 1> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator>(basic_string_view<_CharT, _Traits> __lhs, + __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) > 0; } -template<class _CharT, class _Traits, int = 2> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator>(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, - basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) > 0; +template <class _CharT, class _Traits, int = 2> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator>(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, + basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) > 0; } - // operator <= -template<class _CharT, class _Traits> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator<=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) <= 0; +template <class _CharT, class _Traits> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator<=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) <= 0; } -template<class _CharT, class _Traits, int = 1> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator<=(basic_string_view<_CharT, _Traits> __lhs, - __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) <= 0; +template <class _CharT, class _Traits, int = 1> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator<=(basic_string_view<_CharT, _Traits> __lhs, + __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) <= 0; } -template<class _CharT, class _Traits, int = 2> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator<=(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, - basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) <= 0; +template <class _CharT, class _Traits, int = 2> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator<=(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, + basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) <= 0; } - // operator >= -template<class _CharT, class _Traits> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator>=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) >= 0; +template <class _CharT, class _Traits> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator>=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) >= 0; } - -template<class _CharT, class _Traits, int = 1> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator>=(basic_string_view<_CharT, _Traits> __lhs, - __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) >= 0; +template <class _CharT, class _Traits, int = 1> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator>=(basic_string_view<_CharT, _Traits> __lhs, + __type_identity_t<basic_string_view<_CharT, _Traits> > __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) >= 0; } -template<class _CharT, class _Traits, int = 2> -_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI -bool operator>=(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, - basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT -{ - return __lhs.compare(__rhs) >= 0; +template <class _CharT, class _Traits, int = 2> +_LIBCPP_CONSTEXPR_SINCE_CXX14 _LIBCPP_HIDE_FROM_ABI bool +operator>=(__type_identity_t<basic_string_view<_CharT, _Traits> > __lhs, + basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT { + return __lhs.compare(__rhs) >= 0; } #endif // _LIBCPP_STD_VER >= 20 -template<class _CharT, class _Traits> +template <class _CharT, class _Traits> _LIBCPP_HIDE_FROM_ABI basic_ostream<_CharT, _Traits>& -operator<<(basic_ostream<_CharT, _Traits>& __os, - basic_string_view<_CharT, _Traits> __str); +operator<<(basic_ostream<_CharT, _Traits>& __os, basic_string_view<_CharT, _Traits> __str); // [string.view.hash] -template<class _CharT> -struct __string_view_hash : public __unary_function<basic_string_view<_CharT, char_traits<_CharT> >, size_t> -{ - _LIBCPP_HIDE_FROM_ABI - size_t operator()(const basic_string_view<_CharT, char_traits<_CharT> > __val) const _NOEXCEPT { - return std::__do_string_hash(__val.data(), __val.data() + __val.size()); - } +template <class _CharT> +struct __string_view_hash : public __unary_function<basic_string_view<_CharT, char_traits<_CharT> >, size_t> { + _LIBCPP_HIDE_FROM_ABI size_t operator()(const basic_string_view<_CharT, char_traits<_CharT> > __val) const _NOEXCEPT { + return std::__do_string_hash(__val.data(), __val.data() + __val.size()); + } }; template <> @@ -1005,44 +895,37 @@ struct hash<basic_string_view<wchar_t, char_traits<wchar_t> > > : __string_view_ #endif #if _LIBCPP_STD_VER >= 14 -inline namespace literals -{ - inline namespace string_view_literals - { - inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR - basic_string_view<char> operator""sv(const char *__str, size_t __len) _NOEXCEPT - { - return basic_string_view<char> (__str, __len); - } +inline namespace literals { +inline namespace string_view_literals { +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR basic_string_view<char> +operator""sv(const char* __str, size_t __len) _NOEXCEPT { + return basic_string_view<char>(__str, __len); +} -#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS - inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR - basic_string_view<wchar_t> operator""sv(const wchar_t *__str, size_t __len) _NOEXCEPT - { - return basic_string_view<wchar_t> (__str, __len); - } -#endif +# ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR basic_string_view<wchar_t> +operator""sv(const wchar_t* __str, size_t __len) _NOEXCEPT { + return basic_string_view<wchar_t>(__str, __len); +} +# endif -#ifndef _LIBCPP_HAS_NO_CHAR8_T - inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR - basic_string_view<char8_t> operator""sv(const char8_t *__str, size_t __len) _NOEXCEPT - { - return basic_string_view<char8_t> (__str, __len); - } -#endif +# ifndef _LIBCPP_HAS_NO_CHAR8_T +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR basic_string_view<char8_t> +operator""sv(const char8_t* __str, size_t __len) _NOEXCEPT { + return basic_string_view<char8_t>(__str, __len); +} +# endif + +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR basic_string_view<char16_t> +operator""sv(const char16_t* __str, size_t __len) _NOEXCEPT { + return basic_string_view<char16_t>(__str, __len); +} - inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR - basic_string_view<char16_t> operator""sv(const char16_t *__str, size_t __len) _NOEXCEPT - { - return basic_string_view<char16_t> (__str, __len); - } - - inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR - basic_string_view<char32_t> operator""sv(const char32_t *__str, size_t __len) _NOEXCEPT - { - return basic_string_view<char32_t> (__str, __len); - } - } // namespace string_view_literals +inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR basic_string_view<char32_t> +operator""sv(const char32_t* __str, size_t __len) _NOEXCEPT { + return basic_string_view<char32_t>(__str, __len); +} +} // namespace string_view_literals } // namespace literals #endif _LIBCPP_END_NAMESPACE_STD |