1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===------------------------ string_view ---------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP_STRING_VIEW 11*4d6fc14bSjoerg#define _LIBCPP_STRING_VIEW 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg/* 14*4d6fc14bSjoergstring_view synopsis 15*4d6fc14bSjoerg 16*4d6fc14bSjoergnamespace std { 17*4d6fc14bSjoerg 18*4d6fc14bSjoerg // 7.2, Class template basic_string_view 19*4d6fc14bSjoerg template<class charT, class traits = char_traits<charT>> 20*4d6fc14bSjoerg class basic_string_view; 21*4d6fc14bSjoerg 22*4d6fc14bSjoerg template<class charT, class traits> 23*4d6fc14bSjoerg inline constexpr bool ranges::enable_borrowed_range<basic_string_view<charT, traits>> = true; // C++20 24*4d6fc14bSjoerg 25*4d6fc14bSjoerg // 7.9, basic_string_view non-member comparison functions 26*4d6fc14bSjoerg template<class charT, class traits> 27*4d6fc14bSjoerg constexpr bool operator==(basic_string_view<charT, traits> x, 28*4d6fc14bSjoerg basic_string_view<charT, traits> y) noexcept; 29*4d6fc14bSjoerg template<class charT, class traits> 30*4d6fc14bSjoerg constexpr bool operator!=(basic_string_view<charT, traits> x, 31*4d6fc14bSjoerg basic_string_view<charT, traits> y) noexcept; 32*4d6fc14bSjoerg template<class charT, class traits> 33*4d6fc14bSjoerg constexpr bool operator< (basic_string_view<charT, traits> x, 34*4d6fc14bSjoerg basic_string_view<charT, traits> y) noexcept; 35*4d6fc14bSjoerg template<class charT, class traits> 36*4d6fc14bSjoerg constexpr bool operator> (basic_string_view<charT, traits> x, 37*4d6fc14bSjoerg basic_string_view<charT, traits> y) noexcept; 38*4d6fc14bSjoerg template<class charT, class traits> 39*4d6fc14bSjoerg constexpr bool operator<=(basic_string_view<charT, traits> x, 40*4d6fc14bSjoerg basic_string_view<charT, traits> y) noexcept; 41*4d6fc14bSjoerg template<class charT, class traits> 42*4d6fc14bSjoerg constexpr bool operator>=(basic_string_view<charT, traits> x, 43*4d6fc14bSjoerg basic_string_view<charT, traits> y) noexcept; 44*4d6fc14bSjoerg // see below, sufficient additional overloads of comparison functions 45*4d6fc14bSjoerg 46*4d6fc14bSjoerg // 7.10, Inserters and extractors 47*4d6fc14bSjoerg template<class charT, class traits> 48*4d6fc14bSjoerg basic_ostream<charT, traits>& 49*4d6fc14bSjoerg operator<<(basic_ostream<charT, traits>& os, 50*4d6fc14bSjoerg basic_string_view<charT, traits> str); 51*4d6fc14bSjoerg 52*4d6fc14bSjoerg // basic_string_view typedef names 53*4d6fc14bSjoerg typedef basic_string_view<char> string_view; 54*4d6fc14bSjoerg typedef basic_string_view<char8_t> u8string_view; // C++20 55*4d6fc14bSjoerg typedef basic_string_view<char16_t> u16string_view; 56*4d6fc14bSjoerg typedef basic_string_view<char32_t> u32string_view; 57*4d6fc14bSjoerg typedef basic_string_view<wchar_t> wstring_view; 58*4d6fc14bSjoerg 59*4d6fc14bSjoerg template<class charT, class traits = char_traits<charT>> 60*4d6fc14bSjoerg class basic_string_view { 61*4d6fc14bSjoerg public: 62*4d6fc14bSjoerg // types 63*4d6fc14bSjoerg typedef traits traits_type; 64*4d6fc14bSjoerg typedef charT value_type; 65*4d6fc14bSjoerg typedef charT* pointer; 66*4d6fc14bSjoerg typedef const charT* const_pointer; 67*4d6fc14bSjoerg typedef charT& reference; 68*4d6fc14bSjoerg typedef const charT& const_reference; 69*4d6fc14bSjoerg typedef implementation-defined const_iterator; 70*4d6fc14bSjoerg typedef const_iterator iterator; 71*4d6fc14bSjoerg typedef reverse_iterator<const_iterator> const_reverse_iterator; 72*4d6fc14bSjoerg typedef const_reverse_iterator reverse_iterator; 73*4d6fc14bSjoerg typedef size_t size_type; 74*4d6fc14bSjoerg typedef ptrdiff_t difference_type; 75*4d6fc14bSjoerg static constexpr size_type npos = size_type(-1); 76*4d6fc14bSjoerg 77*4d6fc14bSjoerg // 7.3, basic_string_view constructors and assignment operators 78*4d6fc14bSjoerg constexpr basic_string_view() noexcept; 79*4d6fc14bSjoerg constexpr basic_string_view(const basic_string_view&) noexcept = default; 80*4d6fc14bSjoerg basic_string_view& operator=(const basic_string_view&) noexcept = default; 81*4d6fc14bSjoerg template<class Allocator> 82*4d6fc14bSjoerg constexpr basic_string_view(const charT* str); 83*4d6fc14bSjoerg constexpr basic_string_view(const charT* str, size_type len); 84*4d6fc14bSjoerg 85*4d6fc14bSjoerg // 7.4, basic_string_view iterator support 86*4d6fc14bSjoerg constexpr const_iterator begin() const noexcept; 87*4d6fc14bSjoerg constexpr const_iterator end() const noexcept; 88*4d6fc14bSjoerg constexpr const_iterator cbegin() const noexcept; 89*4d6fc14bSjoerg constexpr const_iterator cend() const noexcept; 90*4d6fc14bSjoerg const_reverse_iterator rbegin() const noexcept; 91*4d6fc14bSjoerg const_reverse_iterator rend() const noexcept; 92*4d6fc14bSjoerg const_reverse_iterator crbegin() const noexcept; 93*4d6fc14bSjoerg const_reverse_iterator crend() const noexcept; 94*4d6fc14bSjoerg 95*4d6fc14bSjoerg // 7.5, basic_string_view capacity 96*4d6fc14bSjoerg constexpr size_type size() const noexcept; 97*4d6fc14bSjoerg constexpr size_type length() const noexcept; 98*4d6fc14bSjoerg constexpr size_type max_size() const noexcept; 99*4d6fc14bSjoerg constexpr bool empty() const noexcept; 100*4d6fc14bSjoerg 101*4d6fc14bSjoerg // 7.6, basic_string_view element access 102*4d6fc14bSjoerg constexpr const_reference operator[](size_type pos) const; 103*4d6fc14bSjoerg constexpr const_reference at(size_type pos) const; 104*4d6fc14bSjoerg constexpr const_reference front() const; 105*4d6fc14bSjoerg constexpr const_reference back() const; 106*4d6fc14bSjoerg constexpr const_pointer data() const noexcept; 107*4d6fc14bSjoerg 108*4d6fc14bSjoerg // 7.7, basic_string_view modifiers 109*4d6fc14bSjoerg constexpr void remove_prefix(size_type n); 110*4d6fc14bSjoerg constexpr void remove_suffix(size_type n); 111*4d6fc14bSjoerg constexpr void swap(basic_string_view& s) noexcept; 112*4d6fc14bSjoerg 113*4d6fc14bSjoerg size_type copy(charT* s, size_type n, size_type pos = 0) const; // constexpr in C++20 114*4d6fc14bSjoerg 115*4d6fc14bSjoerg constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const; 116*4d6fc14bSjoerg constexpr int compare(basic_string_view s) const noexcept; 117*4d6fc14bSjoerg constexpr int compare(size_type pos1, size_type n1, basic_string_view s) const; 118*4d6fc14bSjoerg constexpr int compare(size_type pos1, size_type n1, 119*4d6fc14bSjoerg basic_string_view s, size_type pos2, size_type n2) const; 120*4d6fc14bSjoerg constexpr int compare(const charT* s) const; 121*4d6fc14bSjoerg constexpr int compare(size_type pos1, size_type n1, const charT* s) const; 122*4d6fc14bSjoerg constexpr int compare(size_type pos1, size_type n1, 123*4d6fc14bSjoerg const charT* s, size_type n2) const; 124*4d6fc14bSjoerg constexpr size_type find(basic_string_view s, size_type pos = 0) const noexcept; 125*4d6fc14bSjoerg constexpr size_type find(charT c, size_type pos = 0) const noexcept; 126*4d6fc14bSjoerg constexpr size_type find(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension 127*4d6fc14bSjoerg constexpr size_type find(const charT* s, size_type pos = 0) const noexcept; // noexcept as an extension 128*4d6fc14bSjoerg constexpr size_type rfind(basic_string_view s, size_type pos = npos) const noexcept; 129*4d6fc14bSjoerg constexpr size_type rfind(charT c, size_type pos = npos) const noexcept; 130*4d6fc14bSjoerg constexpr size_type rfind(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension 131*4d6fc14bSjoerg constexpr size_type rfind(const charT* s, size_type pos = npos) const noexcept; // noexcept as an extension 132*4d6fc14bSjoerg constexpr size_type find_first_of(basic_string_view s, size_type pos = 0) const noexcept; 133*4d6fc14bSjoerg constexpr size_type find_first_of(charT c, size_type pos = 0) const noexcept; 134*4d6fc14bSjoerg constexpr size_type find_first_of(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension 135*4d6fc14bSjoerg constexpr size_type find_first_of(const charT* s, size_type pos = 0) const noexcept; // noexcept as an extension 136*4d6fc14bSjoerg constexpr size_type find_last_of(basic_string_view s, size_type pos = npos) const noexcept; 137*4d6fc14bSjoerg constexpr size_type find_last_of(charT c, size_type pos = npos) const noexcept; 138*4d6fc14bSjoerg constexpr size_type find_last_of(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension 139*4d6fc14bSjoerg constexpr size_type find_last_of(const charT* s, size_type pos = npos) const noexcept; // noexcept as an extension 140*4d6fc14bSjoerg constexpr size_type find_first_not_of(basic_string_view s, size_type pos = 0) const noexcept; 141*4d6fc14bSjoerg constexpr size_type find_first_not_of(charT c, size_type pos = 0) const noexcept; 142*4d6fc14bSjoerg constexpr size_type find_first_not_of(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension 143*4d6fc14bSjoerg constexpr size_type find_first_not_of(const charT* s, size_type pos = 0) const noexcept; // noexcept as an extension 144*4d6fc14bSjoerg constexpr size_type find_last_not_of(basic_string_view s, size_type pos = npos) const noexcept; 145*4d6fc14bSjoerg constexpr size_type find_last_not_of(charT c, size_type pos = npos) const noexcept; 146*4d6fc14bSjoerg constexpr size_type find_last_not_of(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension 147*4d6fc14bSjoerg constexpr size_type find_last_not_of(const charT* s, size_type pos = npos) const noexcept; // noexcept as an extension 148*4d6fc14bSjoerg 149*4d6fc14bSjoerg constexpr bool starts_with(basic_string_view s) const noexcept; // C++20 150*4d6fc14bSjoerg constexpr bool starts_with(charT c) const noexcept; // C++20 151*4d6fc14bSjoerg constexpr bool starts_with(const charT* s) const; // C++20 152*4d6fc14bSjoerg constexpr bool ends_with(basic_string_view s) const noexcept; // C++20 153*4d6fc14bSjoerg constexpr bool ends_with(charT c) const noexcept; // C++20 154*4d6fc14bSjoerg constexpr bool ends_with(const charT* s) const; // C++20 155*4d6fc14bSjoerg 156*4d6fc14bSjoerg constexpr bool contains(basic_string_view s) const noexcept; // C++2b 157*4d6fc14bSjoerg constexpr bool contains(charT c) const noexcept; // C++2b 158*4d6fc14bSjoerg constexpr bool contains(const charT* s) const; // C++2b 159*4d6fc14bSjoerg 160*4d6fc14bSjoerg private: 161*4d6fc14bSjoerg const_pointer data_; // exposition only 162*4d6fc14bSjoerg size_type size_; // exposition only 163*4d6fc14bSjoerg }; 164*4d6fc14bSjoerg 165*4d6fc14bSjoerg // 7.11, Hash support 166*4d6fc14bSjoerg template <class T> struct hash; 167*4d6fc14bSjoerg template <> struct hash<string_view>; 168*4d6fc14bSjoerg template <> struct hash<u8string_view>; // C++20 169*4d6fc14bSjoerg template <> struct hash<u16string_view>; 170*4d6fc14bSjoerg template <> struct hash<u32string_view>; 171*4d6fc14bSjoerg template <> struct hash<wstring_view>; 172*4d6fc14bSjoerg 173*4d6fc14bSjoerg constexpr basic_string_view<char> operator "" sv( const char *str, size_t len ) noexcept; 174*4d6fc14bSjoerg constexpr basic_string_view<wchar_t> operator "" sv( const wchar_t *str, size_t len ) noexcept; 175*4d6fc14bSjoerg constexpr basic_string_view<char8_t> operator "" sv( const char8_t *str, size_t len ) noexcept; // C++20 176*4d6fc14bSjoerg constexpr basic_string_view<char16_t> operator "" sv( const char16_t *str, size_t len ) noexcept; 177*4d6fc14bSjoerg constexpr basic_string_view<char32_t> operator "" sv( const char32_t *str, size_t len ) noexcept; 178*4d6fc14bSjoerg 179*4d6fc14bSjoerg} // namespace std 180*4d6fc14bSjoerg 181*4d6fc14bSjoerg 182*4d6fc14bSjoerg*/ 183*4d6fc14bSjoerg 184*4d6fc14bSjoerg#include <__config> 185*4d6fc14bSjoerg#include <__ranges/enable_borrowed_range.h> 186*4d6fc14bSjoerg#include <__string> 187*4d6fc14bSjoerg#include <iosfwd> 188*4d6fc14bSjoerg#include <algorithm> 189*4d6fc14bSjoerg#include <compare> 190*4d6fc14bSjoerg#include <iterator> 191*4d6fc14bSjoerg#include <limits> 192*4d6fc14bSjoerg#include <stdexcept> 193*4d6fc14bSjoerg#include <version> 194*4d6fc14bSjoerg#include <__debug> 195*4d6fc14bSjoerg 196*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 197*4d6fc14bSjoerg#pragma GCC system_header 198*4d6fc14bSjoerg#endif 199*4d6fc14bSjoerg 200*4d6fc14bSjoerg_LIBCPP_PUSH_MACROS 201*4d6fc14bSjoerg#include <__undef_macros> 202*4d6fc14bSjoerg 203*4d6fc14bSjoerg 204*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 205*4d6fc14bSjoerg 206*4d6fc14bSjoergtemplate<class _CharT, class _Traits = char_traits<_CharT> > 207*4d6fc14bSjoerg class _LIBCPP_TEMPLATE_VIS basic_string_view; 208*4d6fc14bSjoerg 209*4d6fc14bSjoergtypedef basic_string_view<char> string_view; 210*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_CHAR8_T 211*4d6fc14bSjoergtypedef basic_string_view<char8_t> u8string_view; 212*4d6fc14bSjoerg#endif 213*4d6fc14bSjoergtypedef basic_string_view<char16_t> u16string_view; 214*4d6fc14bSjoergtypedef basic_string_view<char32_t> u32string_view; 215*4d6fc14bSjoergtypedef basic_string_view<wchar_t> wstring_view; 216*4d6fc14bSjoerg 217*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 218*4d6fc14bSjoergclass 219*4d6fc14bSjoerg _LIBCPP_PREFERRED_NAME(string_view) 220*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_CHAR8_T 221*4d6fc14bSjoerg _LIBCPP_PREFERRED_NAME(u8string_view) 222*4d6fc14bSjoerg#endif 223*4d6fc14bSjoerg _LIBCPP_PREFERRED_NAME(u16string_view) 224*4d6fc14bSjoerg _LIBCPP_PREFERRED_NAME(u32string_view) 225*4d6fc14bSjoerg _LIBCPP_PREFERRED_NAME(wstring_view) 226*4d6fc14bSjoerg basic_string_view { 227*4d6fc14bSjoergpublic: 228*4d6fc14bSjoerg // types 229*4d6fc14bSjoerg typedef _Traits traits_type; 230*4d6fc14bSjoerg typedef _CharT value_type; 231*4d6fc14bSjoerg typedef _CharT* pointer; 232*4d6fc14bSjoerg typedef const _CharT* const_pointer; 233*4d6fc14bSjoerg typedef _CharT& reference; 234*4d6fc14bSjoerg typedef const _CharT& const_reference; 235*4d6fc14bSjoerg typedef const_pointer const_iterator; // See [string.view.iterators] 236*4d6fc14bSjoerg typedef const_iterator iterator; 237*4d6fc14bSjoerg typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 238*4d6fc14bSjoerg typedef const_reverse_iterator reverse_iterator; 239*4d6fc14bSjoerg typedef size_t size_type; 240*4d6fc14bSjoerg typedef ptrdiff_t difference_type; 241*4d6fc14bSjoerg static _LIBCPP_CONSTEXPR const size_type npos = -1; // size_type(-1); 242*4d6fc14bSjoerg 243*4d6fc14bSjoerg static_assert((!is_array<value_type>::value), "Character type of basic_string_view must not be an array"); 244*4d6fc14bSjoerg static_assert(( is_standard_layout<value_type>::value), "Character type of basic_string_view must be standard-layout"); 245*4d6fc14bSjoerg static_assert(( is_trivial<value_type>::value), "Character type of basic_string_view must be trivial"); 246*4d6fc14bSjoerg static_assert((is_same<_CharT, typename traits_type::char_type>::value), 247*4d6fc14bSjoerg "traits_type::char_type must be the same type as CharT"); 248*4d6fc14bSjoerg 249*4d6fc14bSjoerg // [string.view.cons], construct/copy 250*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 251*4d6fc14bSjoerg basic_string_view() _NOEXCEPT : __data (nullptr), __size(0) {} 252*4d6fc14bSjoerg 253*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 254*4d6fc14bSjoerg basic_string_view(const basic_string_view&) _NOEXCEPT = default; 255*4d6fc14bSjoerg 256*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 257*4d6fc14bSjoerg basic_string_view& operator=(const basic_string_view&) _NOEXCEPT = default; 258*4d6fc14bSjoerg 259*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 260*4d6fc14bSjoerg basic_string_view(const _CharT* __s, size_type __len) _NOEXCEPT 261*4d6fc14bSjoerg : __data(__s), __size(__len) 262*4d6fc14bSjoerg { 263*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 264*4d6fc14bSjoerg _LIBCPP_ASSERT(__len == 0 || __s != nullptr, "string_view::string_view(_CharT *, size_t): received nullptr"); 265*4d6fc14bSjoerg#endif 266*4d6fc14bSjoerg } 267*4d6fc14bSjoerg 268*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 269*4d6fc14bSjoerg basic_string_view(const _CharT* __s) 270*4d6fc14bSjoerg : __data(__s), __size(_VSTD::__char_traits_length_checked<_Traits>(__s)) {} 271*4d6fc14bSjoerg 272*4d6fc14bSjoerg // [string.view.iterators], iterators 273*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 274*4d6fc14bSjoerg const_iterator begin() const _NOEXCEPT { return cbegin(); } 275*4d6fc14bSjoerg 276*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 277*4d6fc14bSjoerg const_iterator end() const _NOEXCEPT { return cend(); } 278*4d6fc14bSjoerg 279*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 280*4d6fc14bSjoerg const_iterator cbegin() const _NOEXCEPT { return __data; } 281*4d6fc14bSjoerg 282*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 283*4d6fc14bSjoerg const_iterator cend() const _NOEXCEPT { return __data + __size; } 284*4d6fc14bSjoerg 285*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY 286*4d6fc14bSjoerg const_reverse_iterator rbegin() const _NOEXCEPT { return const_reverse_iterator(cend()); } 287*4d6fc14bSjoerg 288*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY 289*4d6fc14bSjoerg const_reverse_iterator rend() const _NOEXCEPT { return const_reverse_iterator(cbegin()); } 290*4d6fc14bSjoerg 291*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY 292*4d6fc14bSjoerg const_reverse_iterator crbegin() const _NOEXCEPT { return const_reverse_iterator(cend()); } 293*4d6fc14bSjoerg 294*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX14 _LIBCPP_INLINE_VISIBILITY 295*4d6fc14bSjoerg const_reverse_iterator crend() const _NOEXCEPT { return const_reverse_iterator(cbegin()); } 296*4d6fc14bSjoerg 297*4d6fc14bSjoerg // [string.view.capacity], capacity 298*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 299*4d6fc14bSjoerg size_type size() const _NOEXCEPT { return __size; } 300*4d6fc14bSjoerg 301*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 302*4d6fc14bSjoerg size_type length() const _NOEXCEPT { return __size; } 303*4d6fc14bSjoerg 304*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 305*4d6fc14bSjoerg size_type max_size() const _NOEXCEPT { return numeric_limits<size_type>::max(); } 306*4d6fc14bSjoerg 307*4d6fc14bSjoerg _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 308*4d6fc14bSjoerg bool empty() const _NOEXCEPT { return __size == 0; } 309*4d6fc14bSjoerg 310*4d6fc14bSjoerg // [string.view.access], element access 311*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 312*4d6fc14bSjoerg const_reference operator[](size_type __pos) const _NOEXCEPT { 313*4d6fc14bSjoerg return _LIBCPP_ASSERT(__pos < size(), "string_view[] index out of bounds"), __data[__pos]; 314*4d6fc14bSjoerg } 315*4d6fc14bSjoerg 316*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 317*4d6fc14bSjoerg const_reference at(size_type __pos) const 318*4d6fc14bSjoerg { 319*4d6fc14bSjoerg return __pos >= size() 320*4d6fc14bSjoerg ? (__throw_out_of_range("string_view::at"), __data[0]) 321*4d6fc14bSjoerg : __data[__pos]; 322*4d6fc14bSjoerg } 323*4d6fc14bSjoerg 324*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 325*4d6fc14bSjoerg const_reference front() const _NOEXCEPT 326*4d6fc14bSjoerg { 327*4d6fc14bSjoerg return _LIBCPP_ASSERT(!empty(), "string_view::front(): string is empty"), __data[0]; 328*4d6fc14bSjoerg } 329*4d6fc14bSjoerg 330*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 331*4d6fc14bSjoerg const_reference back() const _NOEXCEPT 332*4d6fc14bSjoerg { 333*4d6fc14bSjoerg return _LIBCPP_ASSERT(!empty(), "string_view::back(): string is empty"), __data[__size-1]; 334*4d6fc14bSjoerg } 335*4d6fc14bSjoerg 336*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 337*4d6fc14bSjoerg const_pointer data() const _NOEXCEPT { return __data; } 338*4d6fc14bSjoerg 339*4d6fc14bSjoerg // [string.view.modifiers], modifiers: 340*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 341*4d6fc14bSjoerg void remove_prefix(size_type __n) _NOEXCEPT 342*4d6fc14bSjoerg { 343*4d6fc14bSjoerg _LIBCPP_ASSERT(__n <= size(), "remove_prefix() can't remove more than size()"); 344*4d6fc14bSjoerg __data += __n; 345*4d6fc14bSjoerg __size -= __n; 346*4d6fc14bSjoerg } 347*4d6fc14bSjoerg 348*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 349*4d6fc14bSjoerg void remove_suffix(size_type __n) _NOEXCEPT 350*4d6fc14bSjoerg { 351*4d6fc14bSjoerg _LIBCPP_ASSERT(__n <= size(), "remove_suffix() can't remove more than size()"); 352*4d6fc14bSjoerg __size -= __n; 353*4d6fc14bSjoerg } 354*4d6fc14bSjoerg 355*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 356*4d6fc14bSjoerg void swap(basic_string_view& __other) _NOEXCEPT 357*4d6fc14bSjoerg { 358*4d6fc14bSjoerg const value_type *__p = __data; 359*4d6fc14bSjoerg __data = __other.__data; 360*4d6fc14bSjoerg __other.__data = __p; 361*4d6fc14bSjoerg 362*4d6fc14bSjoerg size_type __sz = __size; 363*4d6fc14bSjoerg __size = __other.__size; 364*4d6fc14bSjoerg __other.__size = __sz; 365*4d6fc14bSjoerg } 366*4d6fc14bSjoerg 367*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 368*4d6fc14bSjoerg size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const 369*4d6fc14bSjoerg { 370*4d6fc14bSjoerg if (__pos > size()) 371*4d6fc14bSjoerg __throw_out_of_range("string_view::copy"); 372*4d6fc14bSjoerg size_type __rlen = _VSTD::min(__n, size() - __pos); 373*4d6fc14bSjoerg _Traits::copy(__s, data() + __pos, __rlen); 374*4d6fc14bSjoerg return __rlen; 375*4d6fc14bSjoerg } 376*4d6fc14bSjoerg 377*4d6fc14bSjoerg _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 378*4d6fc14bSjoerg basic_string_view substr(size_type __pos = 0, size_type __n = npos) const 379*4d6fc14bSjoerg { 380*4d6fc14bSjoerg return __pos > size() 381*4d6fc14bSjoerg ? (__throw_out_of_range("string_view::substr"), basic_string_view()) 382*4d6fc14bSjoerg : basic_string_view(data() + __pos, _VSTD::min(__n, size() - __pos)); 383*4d6fc14bSjoerg } 384*4d6fc14bSjoerg 385*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 int compare(basic_string_view __sv) const _NOEXCEPT 386*4d6fc14bSjoerg { 387*4d6fc14bSjoerg size_type __rlen = _VSTD::min( size(), __sv.size()); 388*4d6fc14bSjoerg int __retval = _Traits::compare(data(), __sv.data(), __rlen); 389*4d6fc14bSjoerg if ( __retval == 0 ) // first __rlen chars matched 390*4d6fc14bSjoerg __retval = size() == __sv.size() ? 0 : ( size() < __sv.size() ? -1 : 1 ); 391*4d6fc14bSjoerg return __retval; 392*4d6fc14bSjoerg } 393*4d6fc14bSjoerg 394*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 395*4d6fc14bSjoerg int compare(size_type __pos1, size_type __n1, basic_string_view __sv) const 396*4d6fc14bSjoerg { 397*4d6fc14bSjoerg return substr(__pos1, __n1).compare(__sv); 398*4d6fc14bSjoerg } 399*4d6fc14bSjoerg 400*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 401*4d6fc14bSjoerg int compare( size_type __pos1, size_type __n1, 402*4d6fc14bSjoerg basic_string_view __sv, size_type __pos2, size_type __n2) const 403*4d6fc14bSjoerg { 404*4d6fc14bSjoerg return substr(__pos1, __n1).compare(__sv.substr(__pos2, __n2)); 405*4d6fc14bSjoerg } 406*4d6fc14bSjoerg 407*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 408*4d6fc14bSjoerg int compare(const _CharT* __s) const _NOEXCEPT 409*4d6fc14bSjoerg { 410*4d6fc14bSjoerg return compare(basic_string_view(__s)); 411*4d6fc14bSjoerg } 412*4d6fc14bSjoerg 413*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 414*4d6fc14bSjoerg int compare(size_type __pos1, size_type __n1, const _CharT* __s) const 415*4d6fc14bSjoerg { 416*4d6fc14bSjoerg return substr(__pos1, __n1).compare(basic_string_view(__s)); 417*4d6fc14bSjoerg } 418*4d6fc14bSjoerg 419*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 420*4d6fc14bSjoerg int compare(size_type __pos1, size_type __n1, const _CharT* __s, size_type __n2) const 421*4d6fc14bSjoerg { 422*4d6fc14bSjoerg return substr(__pos1, __n1).compare(basic_string_view(__s, __n2)); 423*4d6fc14bSjoerg } 424*4d6fc14bSjoerg 425*4d6fc14bSjoerg // find 426*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 427*4d6fc14bSjoerg size_type find(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT 428*4d6fc14bSjoerg { 429*4d6fc14bSjoerg _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr"); 430*4d6fc14bSjoerg return __str_find<value_type, size_type, traits_type, npos> 431*4d6fc14bSjoerg (data(), size(), __s.data(), __pos, __s.size()); 432*4d6fc14bSjoerg } 433*4d6fc14bSjoerg 434*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 435*4d6fc14bSjoerg size_type find(_CharT __c, size_type __pos = 0) const _NOEXCEPT 436*4d6fc14bSjoerg { 437*4d6fc14bSjoerg return __str_find<value_type, size_type, traits_type, npos> 438*4d6fc14bSjoerg (data(), size(), __c, __pos); 439*4d6fc14bSjoerg } 440*4d6fc14bSjoerg 441*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 442*4d6fc14bSjoerg size_type find(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT 443*4d6fc14bSjoerg { 444*4d6fc14bSjoerg _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find(): received nullptr"); 445*4d6fc14bSjoerg return __str_find<value_type, size_type, traits_type, npos> 446*4d6fc14bSjoerg (data(), size(), __s, __pos, __n); 447*4d6fc14bSjoerg } 448*4d6fc14bSjoerg 449*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 450*4d6fc14bSjoerg size_type find(const _CharT* __s, size_type __pos = 0) const _NOEXCEPT 451*4d6fc14bSjoerg { 452*4d6fc14bSjoerg _LIBCPP_ASSERT(__s != nullptr, "string_view::find(): received nullptr"); 453*4d6fc14bSjoerg return __str_find<value_type, size_type, traits_type, npos> 454*4d6fc14bSjoerg (data(), size(), __s, __pos, traits_type::length(__s)); 455*4d6fc14bSjoerg } 456*4d6fc14bSjoerg 457*4d6fc14bSjoerg // rfind 458*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 459*4d6fc14bSjoerg size_type rfind(basic_string_view __s, size_type __pos = npos) const _NOEXCEPT 460*4d6fc14bSjoerg { 461*4d6fc14bSjoerg _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): received nullptr"); 462*4d6fc14bSjoerg return __str_rfind<value_type, size_type, traits_type, npos> 463*4d6fc14bSjoerg (data(), size(), __s.data(), __pos, __s.size()); 464*4d6fc14bSjoerg } 465*4d6fc14bSjoerg 466*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 467*4d6fc14bSjoerg size_type rfind(_CharT __c, size_type __pos = npos) const _NOEXCEPT 468*4d6fc14bSjoerg { 469*4d6fc14bSjoerg return __str_rfind<value_type, size_type, traits_type, npos> 470*4d6fc14bSjoerg (data(), size(), __c, __pos); 471*4d6fc14bSjoerg } 472*4d6fc14bSjoerg 473*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 474*4d6fc14bSjoerg size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT 475*4d6fc14bSjoerg { 476*4d6fc14bSjoerg _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::rfind(): received nullptr"); 477*4d6fc14bSjoerg return __str_rfind<value_type, size_type, traits_type, npos> 478*4d6fc14bSjoerg (data(), size(), __s, __pos, __n); 479*4d6fc14bSjoerg } 480*4d6fc14bSjoerg 481*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 482*4d6fc14bSjoerg size_type rfind(const _CharT* __s, size_type __pos=npos) const _NOEXCEPT 483*4d6fc14bSjoerg { 484*4d6fc14bSjoerg _LIBCPP_ASSERT(__s != nullptr, "string_view::rfind(): received nullptr"); 485*4d6fc14bSjoerg return __str_rfind<value_type, size_type, traits_type, npos> 486*4d6fc14bSjoerg (data(), size(), __s, __pos, traits_type::length(__s)); 487*4d6fc14bSjoerg } 488*4d6fc14bSjoerg 489*4d6fc14bSjoerg // find_first_of 490*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 491*4d6fc14bSjoerg size_type find_first_of(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT 492*4d6fc14bSjoerg { 493*4d6fc14bSjoerg _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_of(): received nullptr"); 494*4d6fc14bSjoerg return __str_find_first_of<value_type, size_type, traits_type, npos> 495*4d6fc14bSjoerg (data(), size(), __s.data(), __pos, __s.size()); 496*4d6fc14bSjoerg } 497*4d6fc14bSjoerg 498*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 499*4d6fc14bSjoerg size_type find_first_of(_CharT __c, size_type __pos = 0) const _NOEXCEPT 500*4d6fc14bSjoerg { return find(__c, __pos); } 501*4d6fc14bSjoerg 502*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 503*4d6fc14bSjoerg size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT 504*4d6fc14bSjoerg { 505*4d6fc14bSjoerg _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_of(): received nullptr"); 506*4d6fc14bSjoerg return __str_find_first_of<value_type, size_type, traits_type, npos> 507*4d6fc14bSjoerg (data(), size(), __s, __pos, __n); 508*4d6fc14bSjoerg } 509*4d6fc14bSjoerg 510*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 511*4d6fc14bSjoerg size_type find_first_of(const _CharT* __s, size_type __pos=0) const _NOEXCEPT 512*4d6fc14bSjoerg { 513*4d6fc14bSjoerg _LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_of(): received nullptr"); 514*4d6fc14bSjoerg return __str_find_first_of<value_type, size_type, traits_type, npos> 515*4d6fc14bSjoerg (data(), size(), __s, __pos, traits_type::length(__s)); 516*4d6fc14bSjoerg } 517*4d6fc14bSjoerg 518*4d6fc14bSjoerg // find_last_of 519*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 520*4d6fc14bSjoerg size_type find_last_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT 521*4d6fc14bSjoerg { 522*4d6fc14bSjoerg _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_of(): received nullptr"); 523*4d6fc14bSjoerg return __str_find_last_of<value_type, size_type, traits_type, npos> 524*4d6fc14bSjoerg (data(), size(), __s.data(), __pos, __s.size()); 525*4d6fc14bSjoerg } 526*4d6fc14bSjoerg 527*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 528*4d6fc14bSjoerg size_type find_last_of(_CharT __c, size_type __pos = npos) const _NOEXCEPT 529*4d6fc14bSjoerg { return rfind(__c, __pos); } 530*4d6fc14bSjoerg 531*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 532*4d6fc14bSjoerg size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT 533*4d6fc14bSjoerg { 534*4d6fc14bSjoerg _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_of(): received nullptr"); 535*4d6fc14bSjoerg return __str_find_last_of<value_type, size_type, traits_type, npos> 536*4d6fc14bSjoerg (data(), size(), __s, __pos, __n); 537*4d6fc14bSjoerg } 538*4d6fc14bSjoerg 539*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 540*4d6fc14bSjoerg size_type find_last_of(const _CharT* __s, size_type __pos=npos) const _NOEXCEPT 541*4d6fc14bSjoerg { 542*4d6fc14bSjoerg _LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_of(): received nullptr"); 543*4d6fc14bSjoerg return __str_find_last_of<value_type, size_type, traits_type, npos> 544*4d6fc14bSjoerg (data(), size(), __s, __pos, traits_type::length(__s)); 545*4d6fc14bSjoerg } 546*4d6fc14bSjoerg 547*4d6fc14bSjoerg // find_first_not_of 548*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 549*4d6fc14bSjoerg size_type find_first_not_of(basic_string_view __s, size_type __pos=0) const _NOEXCEPT 550*4d6fc14bSjoerg { 551*4d6fc14bSjoerg _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_not_of(): received nullptr"); 552*4d6fc14bSjoerg return __str_find_first_not_of<value_type, size_type, traits_type, npos> 553*4d6fc14bSjoerg (data(), size(), __s.data(), __pos, __s.size()); 554*4d6fc14bSjoerg } 555*4d6fc14bSjoerg 556*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 557*4d6fc14bSjoerg size_type find_first_not_of(_CharT __c, size_type __pos=0) const _NOEXCEPT 558*4d6fc14bSjoerg { 559*4d6fc14bSjoerg return __str_find_first_not_of<value_type, size_type, traits_type, npos> 560*4d6fc14bSjoerg (data(), size(), __c, __pos); 561*4d6fc14bSjoerg } 562*4d6fc14bSjoerg 563*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 564*4d6fc14bSjoerg size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT 565*4d6fc14bSjoerg { 566*4d6fc14bSjoerg _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_not_of(): received nullptr"); 567*4d6fc14bSjoerg return __str_find_first_not_of<value_type, size_type, traits_type, npos> 568*4d6fc14bSjoerg (data(), size(), __s, __pos, __n); 569*4d6fc14bSjoerg } 570*4d6fc14bSjoerg 571*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 572*4d6fc14bSjoerg size_type find_first_not_of(const _CharT* __s, size_type __pos=0) const _NOEXCEPT 573*4d6fc14bSjoerg { 574*4d6fc14bSjoerg _LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_not_of(): received nullptr"); 575*4d6fc14bSjoerg return __str_find_first_not_of<value_type, size_type, traits_type, npos> 576*4d6fc14bSjoerg (data(), size(), __s, __pos, traits_type::length(__s)); 577*4d6fc14bSjoerg } 578*4d6fc14bSjoerg 579*4d6fc14bSjoerg // find_last_not_of 580*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 581*4d6fc14bSjoerg size_type find_last_not_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT 582*4d6fc14bSjoerg { 583*4d6fc14bSjoerg _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_not_of(): received nullptr"); 584*4d6fc14bSjoerg return __str_find_last_not_of<value_type, size_type, traits_type, npos> 585*4d6fc14bSjoerg (data(), size(), __s.data(), __pos, __s.size()); 586*4d6fc14bSjoerg } 587*4d6fc14bSjoerg 588*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 589*4d6fc14bSjoerg size_type find_last_not_of(_CharT __c, size_type __pos=npos) const _NOEXCEPT 590*4d6fc14bSjoerg { 591*4d6fc14bSjoerg return __str_find_last_not_of<value_type, size_type, traits_type, npos> 592*4d6fc14bSjoerg (data(), size(), __c, __pos); 593*4d6fc14bSjoerg } 594*4d6fc14bSjoerg 595*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 596*4d6fc14bSjoerg size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const _NOEXCEPT 597*4d6fc14bSjoerg { 598*4d6fc14bSjoerg _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_not_of(): received nullptr"); 599*4d6fc14bSjoerg return __str_find_last_not_of<value_type, size_type, traits_type, npos> 600*4d6fc14bSjoerg (data(), size(), __s, __pos, __n); 601*4d6fc14bSjoerg } 602*4d6fc14bSjoerg 603*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 604*4d6fc14bSjoerg size_type find_last_not_of(const _CharT* __s, size_type __pos=npos) const _NOEXCEPT 605*4d6fc14bSjoerg { 606*4d6fc14bSjoerg _LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_not_of(): received nullptr"); 607*4d6fc14bSjoerg return __str_find_last_not_of<value_type, size_type, traits_type, npos> 608*4d6fc14bSjoerg (data(), size(), __s, __pos, traits_type::length(__s)); 609*4d6fc14bSjoerg } 610*4d6fc14bSjoerg 611*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17 612*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 613*4d6fc14bSjoerg bool starts_with(basic_string_view __s) const _NOEXCEPT 614*4d6fc14bSjoerg { return size() >= __s.size() && compare(0, __s.size(), __s) == 0; } 615*4d6fc14bSjoerg 616*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 617*4d6fc14bSjoerg bool starts_with(value_type __c) const _NOEXCEPT 618*4d6fc14bSjoerg { return !empty() && _Traits::eq(front(), __c); } 619*4d6fc14bSjoerg 620*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 621*4d6fc14bSjoerg bool starts_with(const value_type* __s) const _NOEXCEPT 622*4d6fc14bSjoerg { return starts_with(basic_string_view(__s)); } 623*4d6fc14bSjoerg 624*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 625*4d6fc14bSjoerg bool ends_with(basic_string_view __s) const _NOEXCEPT 626*4d6fc14bSjoerg { return size() >= __s.size() && compare(size() - __s.size(), npos, __s) == 0; } 627*4d6fc14bSjoerg 628*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 629*4d6fc14bSjoerg bool ends_with(value_type __c) const _NOEXCEPT 630*4d6fc14bSjoerg { return !empty() && _Traits::eq(back(), __c); } 631*4d6fc14bSjoerg 632*4d6fc14bSjoerg _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 633*4d6fc14bSjoerg bool ends_with(const value_type* __s) const _NOEXCEPT 634*4d6fc14bSjoerg { return ends_with(basic_string_view(__s)); } 635*4d6fc14bSjoerg#endif 636*4d6fc14bSjoerg 637*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 20 638*4d6fc14bSjoerg constexpr _LIBCPP_INLINE_VISIBILITY 639*4d6fc14bSjoerg bool contains(basic_string_view __sv) const noexcept 640*4d6fc14bSjoerg { return find(__sv) != npos; } 641*4d6fc14bSjoerg 642*4d6fc14bSjoerg constexpr _LIBCPP_INLINE_VISIBILITY 643*4d6fc14bSjoerg bool contains(value_type __c) const noexcept 644*4d6fc14bSjoerg { return find(__c) != npos; } 645*4d6fc14bSjoerg 646*4d6fc14bSjoerg constexpr _LIBCPP_INLINE_VISIBILITY 647*4d6fc14bSjoerg bool contains(const value_type* __s) const 648*4d6fc14bSjoerg { return find(__s) != npos; } 649*4d6fc14bSjoerg#endif 650*4d6fc14bSjoerg 651*4d6fc14bSjoergprivate: 652*4d6fc14bSjoerg const value_type* __data; 653*4d6fc14bSjoerg size_type __size; 654*4d6fc14bSjoerg}; 655*4d6fc14bSjoerg 656*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_RANGES) 657*4d6fc14bSjoergtemplate <class _CharT, class _Traits> 658*4d6fc14bSjoerginline constexpr bool ranges::enable_borrowed_range<basic_string_view<_CharT, _Traits> > = true; 659*4d6fc14bSjoerg#endif // _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_RANGES) 660*4d6fc14bSjoerg 661*4d6fc14bSjoerg// [string.view.comparison] 662*4d6fc14bSjoerg// operator == 663*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 664*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 665*4d6fc14bSjoergbool operator==(basic_string_view<_CharT, _Traits> __lhs, 666*4d6fc14bSjoerg basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 667*4d6fc14bSjoerg{ 668*4d6fc14bSjoerg if ( __lhs.size() != __rhs.size()) return false; 669*4d6fc14bSjoerg return __lhs.compare(__rhs) == 0; 670*4d6fc14bSjoerg} 671*4d6fc14bSjoerg 672*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 673*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 674*4d6fc14bSjoergbool operator==(basic_string_view<_CharT, _Traits> __lhs, 675*4d6fc14bSjoerg typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 676*4d6fc14bSjoerg{ 677*4d6fc14bSjoerg if ( __lhs.size() != __rhs.size()) return false; 678*4d6fc14bSjoerg return __lhs.compare(__rhs) == 0; 679*4d6fc14bSjoerg} 680*4d6fc14bSjoerg 681*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 682*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 683*4d6fc14bSjoergbool operator==(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 684*4d6fc14bSjoerg basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 685*4d6fc14bSjoerg{ 686*4d6fc14bSjoerg if ( __lhs.size() != __rhs.size()) return false; 687*4d6fc14bSjoerg return __lhs.compare(__rhs) == 0; 688*4d6fc14bSjoerg} 689*4d6fc14bSjoerg 690*4d6fc14bSjoerg 691*4d6fc14bSjoerg// operator != 692*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 693*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 694*4d6fc14bSjoergbool operator!=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 695*4d6fc14bSjoerg{ 696*4d6fc14bSjoerg if ( __lhs.size() != __rhs.size()) 697*4d6fc14bSjoerg return true; 698*4d6fc14bSjoerg return __lhs.compare(__rhs) != 0; 699*4d6fc14bSjoerg} 700*4d6fc14bSjoerg 701*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 702*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 703*4d6fc14bSjoergbool operator!=(basic_string_view<_CharT, _Traits> __lhs, 704*4d6fc14bSjoerg typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 705*4d6fc14bSjoerg{ 706*4d6fc14bSjoerg if ( __lhs.size() != __rhs.size()) 707*4d6fc14bSjoerg return true; 708*4d6fc14bSjoerg return __lhs.compare(__rhs) != 0; 709*4d6fc14bSjoerg} 710*4d6fc14bSjoerg 711*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 712*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 713*4d6fc14bSjoergbool operator!=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 714*4d6fc14bSjoerg basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 715*4d6fc14bSjoerg{ 716*4d6fc14bSjoerg if ( __lhs.size() != __rhs.size()) 717*4d6fc14bSjoerg return true; 718*4d6fc14bSjoerg return __lhs.compare(__rhs) != 0; 719*4d6fc14bSjoerg} 720*4d6fc14bSjoerg 721*4d6fc14bSjoerg 722*4d6fc14bSjoerg// operator < 723*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 724*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 725*4d6fc14bSjoergbool operator<(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 726*4d6fc14bSjoerg{ 727*4d6fc14bSjoerg return __lhs.compare(__rhs) < 0; 728*4d6fc14bSjoerg} 729*4d6fc14bSjoerg 730*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 731*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 732*4d6fc14bSjoergbool operator<(basic_string_view<_CharT, _Traits> __lhs, 733*4d6fc14bSjoerg typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 734*4d6fc14bSjoerg{ 735*4d6fc14bSjoerg return __lhs.compare(__rhs) < 0; 736*4d6fc14bSjoerg} 737*4d6fc14bSjoerg 738*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 739*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 740*4d6fc14bSjoergbool operator<(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 741*4d6fc14bSjoerg basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 742*4d6fc14bSjoerg{ 743*4d6fc14bSjoerg return __lhs.compare(__rhs) < 0; 744*4d6fc14bSjoerg} 745*4d6fc14bSjoerg 746*4d6fc14bSjoerg 747*4d6fc14bSjoerg// operator > 748*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 749*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 750*4d6fc14bSjoergbool operator> (basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 751*4d6fc14bSjoerg{ 752*4d6fc14bSjoerg return __lhs.compare(__rhs) > 0; 753*4d6fc14bSjoerg} 754*4d6fc14bSjoerg 755*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 756*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 757*4d6fc14bSjoergbool operator>(basic_string_view<_CharT, _Traits> __lhs, 758*4d6fc14bSjoerg typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 759*4d6fc14bSjoerg{ 760*4d6fc14bSjoerg return __lhs.compare(__rhs) > 0; 761*4d6fc14bSjoerg} 762*4d6fc14bSjoerg 763*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 764*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 765*4d6fc14bSjoergbool operator>(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 766*4d6fc14bSjoerg basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 767*4d6fc14bSjoerg{ 768*4d6fc14bSjoerg return __lhs.compare(__rhs) > 0; 769*4d6fc14bSjoerg} 770*4d6fc14bSjoerg 771*4d6fc14bSjoerg 772*4d6fc14bSjoerg// operator <= 773*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 774*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 775*4d6fc14bSjoergbool operator<=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 776*4d6fc14bSjoerg{ 777*4d6fc14bSjoerg return __lhs.compare(__rhs) <= 0; 778*4d6fc14bSjoerg} 779*4d6fc14bSjoerg 780*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 781*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 782*4d6fc14bSjoergbool operator<=(basic_string_view<_CharT, _Traits> __lhs, 783*4d6fc14bSjoerg typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 784*4d6fc14bSjoerg{ 785*4d6fc14bSjoerg return __lhs.compare(__rhs) <= 0; 786*4d6fc14bSjoerg} 787*4d6fc14bSjoerg 788*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 789*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 790*4d6fc14bSjoergbool operator<=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 791*4d6fc14bSjoerg basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 792*4d6fc14bSjoerg{ 793*4d6fc14bSjoerg return __lhs.compare(__rhs) <= 0; 794*4d6fc14bSjoerg} 795*4d6fc14bSjoerg 796*4d6fc14bSjoerg 797*4d6fc14bSjoerg// operator >= 798*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 799*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 800*4d6fc14bSjoergbool operator>=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 801*4d6fc14bSjoerg{ 802*4d6fc14bSjoerg return __lhs.compare(__rhs) >= 0; 803*4d6fc14bSjoerg} 804*4d6fc14bSjoerg 805*4d6fc14bSjoerg 806*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 807*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 808*4d6fc14bSjoergbool operator>=(basic_string_view<_CharT, _Traits> __lhs, 809*4d6fc14bSjoerg typename common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 810*4d6fc14bSjoerg{ 811*4d6fc14bSjoerg return __lhs.compare(__rhs) >= 0; 812*4d6fc14bSjoerg} 813*4d6fc14bSjoerg 814*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 815*4d6fc14bSjoerg_LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 816*4d6fc14bSjoergbool operator>=(typename common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 817*4d6fc14bSjoerg basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 818*4d6fc14bSjoerg{ 819*4d6fc14bSjoerg return __lhs.compare(__rhs) >= 0; 820*4d6fc14bSjoerg} 821*4d6fc14bSjoerg 822*4d6fc14bSjoerg 823*4d6fc14bSjoergtemplate<class _CharT, class _Traits> 824*4d6fc14bSjoergbasic_ostream<_CharT, _Traits>& 825*4d6fc14bSjoergoperator<<(basic_ostream<_CharT, _Traits>& __os, 826*4d6fc14bSjoerg basic_string_view<_CharT, _Traits> __str); 827*4d6fc14bSjoerg 828*4d6fc14bSjoerg// [string.view.hash] 829*4d6fc14bSjoergtemplate<class _CharT> 830*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS hash<basic_string_view<_CharT, char_traits<_CharT> > > 831*4d6fc14bSjoerg : public unary_function<basic_string_view<_CharT, char_traits<_CharT> >, size_t> 832*4d6fc14bSjoerg{ 833*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 834*4d6fc14bSjoerg size_t operator()(const basic_string_view<_CharT, char_traits<_CharT> > __val) const _NOEXCEPT { 835*4d6fc14bSjoerg return __do_string_hash(__val.data(), __val.data() + __val.size()); 836*4d6fc14bSjoerg } 837*4d6fc14bSjoerg}; 838*4d6fc14bSjoerg 839*4d6fc14bSjoerg 840*4d6fc14bSjoerg#if _LIBCPP_STD_VER > 11 841*4d6fc14bSjoerginline namespace literals 842*4d6fc14bSjoerg{ 843*4d6fc14bSjoerg inline namespace string_view_literals 844*4d6fc14bSjoerg { 845*4d6fc14bSjoerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 846*4d6fc14bSjoerg basic_string_view<char> operator "" sv(const char *__str, size_t __len) _NOEXCEPT 847*4d6fc14bSjoerg { 848*4d6fc14bSjoerg return basic_string_view<char> (__str, __len); 849*4d6fc14bSjoerg } 850*4d6fc14bSjoerg 851*4d6fc14bSjoerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 852*4d6fc14bSjoerg basic_string_view<wchar_t> operator "" sv(const wchar_t *__str, size_t __len) _NOEXCEPT 853*4d6fc14bSjoerg { 854*4d6fc14bSjoerg return basic_string_view<wchar_t> (__str, __len); 855*4d6fc14bSjoerg } 856*4d6fc14bSjoerg 857*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_CHAR8_T 858*4d6fc14bSjoerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 859*4d6fc14bSjoerg basic_string_view<char8_t> operator "" sv(const char8_t *__str, size_t __len) _NOEXCEPT 860*4d6fc14bSjoerg { 861*4d6fc14bSjoerg return basic_string_view<char8_t> (__str, __len); 862*4d6fc14bSjoerg } 863*4d6fc14bSjoerg#endif 864*4d6fc14bSjoerg 865*4d6fc14bSjoerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 866*4d6fc14bSjoerg basic_string_view<char16_t> operator "" sv(const char16_t *__str, size_t __len) _NOEXCEPT 867*4d6fc14bSjoerg { 868*4d6fc14bSjoerg return basic_string_view<char16_t> (__str, __len); 869*4d6fc14bSjoerg } 870*4d6fc14bSjoerg 871*4d6fc14bSjoerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR 872*4d6fc14bSjoerg basic_string_view<char32_t> operator "" sv(const char32_t *__str, size_t __len) _NOEXCEPT 873*4d6fc14bSjoerg { 874*4d6fc14bSjoerg return basic_string_view<char32_t> (__str, __len); 875*4d6fc14bSjoerg } 876*4d6fc14bSjoerg } 877*4d6fc14bSjoerg} 878*4d6fc14bSjoerg#endif 879*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 880*4d6fc14bSjoerg 881*4d6fc14bSjoerg_LIBCPP_POP_MACROS 882*4d6fc14bSjoerg 883*4d6fc14bSjoerg#endif // _LIBCPP_STRING_VIEW 884