1276792Sdim// -*- C++ -*- 2276792Sdim//===------------------------ string_view ---------------------------------===// 3276792Sdim// 4276792Sdim// The LLVM Compiler Infrastructure 5276792Sdim// 6276792Sdim// This file is distributed under the University of Illinois Open Source 7276792Sdim// License. See LICENSE.TXT for details. 8276792Sdim// 9276792Sdim//===----------------------------------------------------------------------===// 10276792Sdim 11276792Sdim#ifndef _LIBCPP_LFTS_STRING_VIEW 12276792Sdim#define _LIBCPP_LFTS_STRING_VIEW 13276792Sdim 14276792Sdim/* 15276792Sdimstring_view synopsis 16276792Sdim 17276792Sdimnamespace std { 18276792Sdim namespace experimental { 19276792Sdim inline namespace library_fundamentals_v1 { 20276792Sdim 21276792Sdim // 7.2, Class template basic_string_view 22276792Sdim template<class charT, class traits = char_traits<charT>> 23276792Sdim class basic_string_view; 24276792Sdim 25276792Sdim // 7.9, basic_string_view non-member comparison functions 26276792Sdim template<class charT, class traits> 27276792Sdim constexpr bool operator==(basic_string_view<charT, traits> x, 28276792Sdim basic_string_view<charT, traits> y) noexcept; 29276792Sdim template<class charT, class traits> 30276792Sdim constexpr bool operator!=(basic_string_view<charT, traits> x, 31276792Sdim basic_string_view<charT, traits> y) noexcept; 32276792Sdim template<class charT, class traits> 33276792Sdim constexpr bool operator< (basic_string_view<charT, traits> x, 34276792Sdim basic_string_view<charT, traits> y) noexcept; 35276792Sdim template<class charT, class traits> 36276792Sdim constexpr bool operator> (basic_string_view<charT, traits> x, 37276792Sdim basic_string_view<charT, traits> y) noexcept; 38276792Sdim template<class charT, class traits> 39276792Sdim constexpr bool operator<=(basic_string_view<charT, traits> x, 40276792Sdim basic_string_view<charT, traits> y) noexcept; 41276792Sdim template<class charT, class traits> 42276792Sdim constexpr bool operator>=(basic_string_view<charT, traits> x, 43276792Sdim basic_string_view<charT, traits> y) noexcept; 44276792Sdim // see below, sufficient additional overloads of comparison functions 45276792Sdim 46276792Sdim // 7.10, Inserters and extractors 47276792Sdim template<class charT, class traits> 48276792Sdim basic_ostream<charT, traits>& 49276792Sdim operator<<(basic_ostream<charT, traits>& os, 50276792Sdim basic_string_view<charT, traits> str); 51276792Sdim 52276792Sdim // basic_string_view typedef names 53276792Sdim typedef basic_string_view<char> string_view; 54276792Sdim typedef basic_string_view<char16_t> u16string_view; 55276792Sdim typedef basic_string_view<char32_t> u32string_view; 56276792Sdim typedef basic_string_view<wchar_t> wstring_view; 57276792Sdim 58276792Sdim template<class charT, class traits = char_traits<charT>> 59276792Sdim class basic_string_view { 60276792Sdim public: 61276792Sdim // types 62276792Sdim typedef traits traits_type; 63276792Sdim typedef charT value_type; 64276792Sdim typedef charT* pointer; 65276792Sdim typedef const charT* const_pointer; 66276792Sdim typedef charT& reference; 67276792Sdim typedef const charT& const_reference; 68276792Sdim typedef implementation-defined const_iterator; 69276792Sdim typedef const_iterator iterator; 70276792Sdim typedef reverse_iterator<const_iterator> const_reverse_iterator; 71276792Sdim typedef const_reverse_iterator reverse_iterator; 72276792Sdim typedef size_t size_type; 73276792Sdim typedef ptrdiff_t difference_type; 74276792Sdim static constexpr size_type npos = size_type(-1); 75276792Sdim 76276792Sdim // 7.3, basic_string_view constructors and assignment operators 77276792Sdim constexpr basic_string_view() noexcept; 78276792Sdim constexpr basic_string_view(const basic_string_view&) noexcept = default; 79276792Sdim basic_string_view& operator=(const basic_string_view&) noexcept = default; 80276792Sdim template<class Allocator> 81276792Sdim basic_string_view(const basic_string<charT, traits, Allocator>& str) noexcept; 82276792Sdim constexpr basic_string_view(const charT* str); 83276792Sdim constexpr basic_string_view(const charT* str, size_type len); 84276792Sdim 85276792Sdim // 7.4, basic_string_view iterator support 86276792Sdim constexpr const_iterator begin() const noexcept; 87276792Sdim constexpr const_iterator end() const noexcept; 88276792Sdim constexpr const_iterator cbegin() const noexcept; 89276792Sdim constexpr const_iterator cend() const noexcept; 90276792Sdim const_reverse_iterator rbegin() const noexcept; 91276792Sdim const_reverse_iterator rend() const noexcept; 92276792Sdim const_reverse_iterator crbegin() const noexcept; 93276792Sdim const_reverse_iterator crend() const noexcept; 94276792Sdim 95276792Sdim // 7.5, basic_string_view capacity 96276792Sdim constexpr size_type size() const noexcept; 97276792Sdim constexpr size_type length() const noexcept; 98276792Sdim constexpr size_type max_size() const noexcept; 99276792Sdim constexpr bool empty() const noexcept; 100276792Sdim 101276792Sdim // 7.6, basic_string_view element access 102276792Sdim constexpr const_reference operator[](size_type pos) const; 103276792Sdim constexpr const_reference at(size_type pos) const; 104276792Sdim constexpr const_reference front() const; 105276792Sdim constexpr const_reference back() const; 106276792Sdim constexpr const_pointer data() const noexcept; 107276792Sdim 108276792Sdim // 7.7, basic_string_view modifiers 109276792Sdim constexpr void clear() noexcept; 110276792Sdim constexpr void remove_prefix(size_type n); 111276792Sdim constexpr void remove_suffix(size_type n); 112276792Sdim constexpr void swap(basic_string_view& s) noexcept; 113276792Sdim 114276792Sdim // 7.8, basic_string_view string operations 115276792Sdim template<class Allocator> 116276792Sdim explicit operator basic_string<charT, traits, Allocator>() const; 117276792Sdim template<class Allocator = allocator<charT>> 118276792Sdim basic_string<charT, traits, Allocator> to_string( 119276792Sdim const Allocator& a = Allocator()) const; 120276792Sdim 121276792Sdim size_type copy(charT* s, size_type n, size_type pos = 0) const; 122276792Sdim 123276792Sdim constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const; 124276792Sdim constexpr int compare(basic_string_view s) const noexcept; 125276792Sdim constexpr int compare(size_type pos1, size_type n1, basic_string_view s) const; 126276792Sdim constexpr int compare(size_type pos1, size_type n1, 127276792Sdim basic_string_view s, size_type pos2, size_type n2) const; 128276792Sdim constexpr int compare(const charT* s) const; 129276792Sdim constexpr int compare(size_type pos1, size_type n1, const charT* s) const; 130276792Sdim constexpr int compare(size_type pos1, size_type n1, 131276792Sdim const charT* s, size_type n2) const; 132276792Sdim constexpr size_type find(basic_string_view s, size_type pos = 0) const noexcept; 133276792Sdim constexpr size_type find(charT c, size_type pos = 0) const noexcept; 134276792Sdim constexpr size_type find(const charT* s, size_type pos, size_type n) const; 135276792Sdim constexpr size_type find(const charT* s, size_type pos = 0) const; 136276792Sdim constexpr size_type rfind(basic_string_view s, size_type pos = npos) const noexcept; 137276792Sdim constexpr size_type rfind(charT c, size_type pos = npos) const noexcept; 138276792Sdim constexpr size_type rfind(const charT* s, size_type pos, size_type n) const; 139276792Sdim constexpr size_type rfind(const charT* s, size_type pos = npos) const; 140276792Sdim constexpr size_type find_first_of(basic_string_view s, size_type pos = 0) const noexcept; 141276792Sdim constexpr size_type find_first_of(charT c, size_type pos = 0) const noexcept; 142276792Sdim constexpr size_type find_first_of(const charT* s, size_type pos, size_type n) const; 143276792Sdim constexpr size_type find_first_of(const charT* s, size_type pos = 0) const; 144276792Sdim constexpr size_type find_last_of(basic_string_view s, size_type pos = npos) const noexcept; 145276792Sdim constexpr size_type find_last_of(charT c, size_type pos = npos) const noexcept; 146276792Sdim constexpr size_type find_last_of(const charT* s, size_type pos, size_type n) const; 147276792Sdim constexpr size_type find_last_of(const charT* s, size_type pos = npos) const; 148276792Sdim constexpr size_type find_first_not_of(basic_string_view s, size_type pos = 0) const noexcept; 149276792Sdim constexpr size_type find_first_not_of(charT c, size_type pos = 0) const noexcept; 150276792Sdim constexpr size_type find_first_not_of(const charT* s, size_type pos, size_type n) const; 151276792Sdim constexpr size_type find_first_not_of(const charT* s, size_type pos = 0) const; 152276792Sdim constexpr size_type find_last_not_of(basic_string_view s, size_type pos = npos) const noexcept; 153276792Sdim constexpr size_type find_last_not_of(charT c, size_type pos = npos) const noexcept; 154276792Sdim constexpr size_type find_last_not_of(const charT* s, size_type pos, size_type n) const; 155276792Sdim constexpr size_type find_last_not_of(const charT* s, size_type pos = npos) const; 156276792Sdim 157276792Sdim private: 158276792Sdim const_pointer data_; // exposition only 159276792Sdim size_type size_; // exposition only 160276792Sdim }; 161276792Sdim 162276792Sdim } // namespace fundamentals_v1 163276792Sdim } // namespace experimental 164276792Sdim 165276792Sdim // 7.11, Hash support 166276792Sdim template <class T> struct hash; 167276792Sdim template <> struct hash<experimental::string_view>; 168276792Sdim template <> struct hash<experimental::u16string_view>; 169276792Sdim template <> struct hash<experimental::u32string_view>; 170276792Sdim template <> struct hash<experimental::wstring_view>; 171276792Sdim 172276792Sdim} // namespace std 173276792Sdim 174276792Sdim 175276792Sdim*/ 176276792Sdim 177276792Sdim#include <experimental/__config> 178276792Sdim 179276792Sdim#include <string> 180276792Sdim#include <algorithm> 181276792Sdim#include <iterator> 182276792Sdim#include <ostream> 183276792Sdim#include <iomanip> 184276792Sdim 185276792Sdim#include <__debug> 186276792Sdim 187276792Sdim#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 188276792Sdim#pragma GCC system_header 189276792Sdim#endif 190276792Sdim 191276792Sdim_LIBCPP_BEGIN_NAMESPACE_LFTS 192276792Sdim 193276792Sdim template<class _CharT, class _Traits = _VSTD::char_traits<_CharT> > 194276792Sdim class _LIBCPP_TYPE_VIS_ONLY basic_string_view { 195276792Sdim public: 196276792Sdim // types 197276792Sdim typedef _Traits traits_type; 198276792Sdim typedef _CharT value_type; 199276792Sdim typedef const _CharT* pointer; 200276792Sdim typedef const _CharT* const_pointer; 201276792Sdim typedef const _CharT& reference; 202276792Sdim typedef const _CharT& const_reference; 203276792Sdim typedef const_pointer const_iterator; // See [string.view.iterators] 204276792Sdim typedef const_iterator iterator; 205276792Sdim typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 206276792Sdim typedef const_reverse_iterator reverse_iterator; 207276792Sdim typedef size_t size_type; 208276792Sdim typedef ptrdiff_t difference_type; 209276792Sdim static _LIBCPP_CONSTEXPR const size_type npos = -1; // size_type(-1); 210276792Sdim 211276792Sdim // [string.view.cons], construct/copy 212276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 213276792Sdim basic_string_view() _NOEXCEPT : __data (nullptr), __size(0) {} 214276792Sdim 215276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 216276792Sdim basic_string_view(const basic_string_view&) _NOEXCEPT = default; 217276792Sdim 218276792Sdim _LIBCPP_INLINE_VISIBILITY 219276792Sdim basic_string_view& operator=(const basic_string_view&) _NOEXCEPT = default; 220276792Sdim 221276792Sdim template<class _Allocator> 222276792Sdim _LIBCPP_INLINE_VISIBILITY 223276792Sdim basic_string_view(const basic_string<_CharT, _Traits, _Allocator>& __str) _NOEXCEPT 224276792Sdim : __data (__str.data()), __size(__str.size()) {} 225276792Sdim 226276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 227276792Sdim basic_string_view(const _CharT* __s, size_type __len) 228276792Sdim : __data(__s), __size(__len) 229276792Sdim { 230276792Sdim// _LIBCPP_ASSERT(__len == 0 || __s != nullptr, "string_view::string_view(_CharT *, size_t): recieved nullptr"); 231276792Sdim } 232276792Sdim 233276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 234276792Sdim basic_string_view(const _CharT* __s) 235276792Sdim : __data(__s), __size(_Traits::length(__s)) {} 236276792Sdim 237276792Sdim // [string.view.iterators], iterators 238276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 239276792Sdim const_iterator begin() const _NOEXCEPT { return cbegin(); } 240276792Sdim 241276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 242276792Sdim const_iterator end() const _NOEXCEPT { return cend(); } 243276792Sdim 244276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 245276792Sdim const_iterator cbegin() const _NOEXCEPT { return __data; } 246276792Sdim 247276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 248276792Sdim const_iterator cend() const _NOEXCEPT { return __data + __size; } 249276792Sdim 250276792Sdim _LIBCPP_INLINE_VISIBILITY 251276792Sdim const_reverse_iterator rbegin() const _NOEXCEPT { return const_reverse_iterator(cend()); } 252276792Sdim 253276792Sdim _LIBCPP_INLINE_VISIBILITY 254276792Sdim const_reverse_iterator rend() const _NOEXCEPT { return const_reverse_iterator(cbegin()); } 255276792Sdim 256276792Sdim _LIBCPP_INLINE_VISIBILITY 257276792Sdim const_reverse_iterator crbegin() const _NOEXCEPT { return const_reverse_iterator(cend()); } 258276792Sdim 259276792Sdim _LIBCPP_INLINE_VISIBILITY 260276792Sdim const_reverse_iterator crend() const _NOEXCEPT { return const_reverse_iterator(cbegin()); } 261276792Sdim 262276792Sdim // [string.view.capacity], capacity 263276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 264276792Sdim size_type size() const _NOEXCEPT { return __size; } 265276792Sdim 266276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 267276792Sdim size_type length() const _NOEXCEPT { return __size; } 268276792Sdim 269276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 270276792Sdim size_type max_size() const _NOEXCEPT { return _VSTD::numeric_limits<size_type>::max(); } 271276792Sdim 272276792Sdim _LIBCPP_CONSTEXPR bool _LIBCPP_INLINE_VISIBILITY 273276792Sdim empty() const _NOEXCEPT { return __size == 0; } 274276792Sdim 275276792Sdim // [string.view.access], element access 276276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 277276792Sdim const_reference operator[](size_type __pos) const { return __data[__pos]; } 278276792Sdim 279276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 280276792Sdim const_reference at(size_type __pos) const 281276792Sdim { 282276792Sdim return __pos >= size() 283276792Sdim ? throw out_of_range("string_view::at") 284276792Sdim : __data[__pos]; 285276792Sdim// if (__pos >= size()) 286276792Sdim// throw out_of_range("string_view::at"); 287276792Sdim// return __data[__pos]; 288276792Sdim } 289276792Sdim 290276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 291276792Sdim const_reference front() const 292276792Sdim { 293276792Sdim return _LIBCPP_ASSERT(!empty(), "string_view::front(): string is empty"), __data[0]; 294276792Sdim } 295276792Sdim 296276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 297276792Sdim const_reference back() const 298276792Sdim { 299276792Sdim return _LIBCPP_ASSERT(!empty(), "string_view::back(): string is empty"), __data[__size-1]; 300276792Sdim } 301276792Sdim 302276792Sdim _LIBCPP_CONSTEXPR _LIBCPP_INLINE_VISIBILITY 303276792Sdim const_pointer data() const _NOEXCEPT { return __data; } 304276792Sdim 305276792Sdim // [string.view.modifiers], modifiers: 306276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 307276792Sdim void clear() _NOEXCEPT 308276792Sdim { 309276792Sdim __data = nullptr; 310276792Sdim __size = 0; 311276792Sdim } 312276792Sdim 313276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 314276792Sdim void remove_prefix(size_type __n) _NOEXCEPT 315276792Sdim { 316276792Sdim _LIBCPP_ASSERT(n <= size(), "remove_prefix() can't remove more than size()"); 317276792Sdim __data += __n; 318276792Sdim __size -= __n; 319276792Sdim } 320276792Sdim 321276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 322276792Sdim void remove_suffix(size_type __n) _NOEXCEPT 323276792Sdim { 324276792Sdim _LIBCPP_ASSERT(n <= size(), "remove_suffix() can't remove more than size()"); 325276792Sdim __size -= __n; 326276792Sdim } 327276792Sdim 328276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 329276792Sdim void swap(basic_string_view& __other) _NOEXCEPT 330276792Sdim { 331276792Sdim const value_type *__p = __data; 332276792Sdim __data = __other.__data; 333276792Sdim __other.__data = __p; 334276792Sdim 335276792Sdim size_type __sz = __size; 336276792Sdim __size = __other.__size; 337276792Sdim __other.__size = __sz; 338276792Sdim// _VSTD::swap( __data, __other.__data ); 339276792Sdim// _VSTD::swap( __size, __other.__size ); 340276792Sdim } 341276792Sdim 342276792Sdim // [string.view.ops], string operations: 343276792Sdim template<class _Allocator> 344276792Sdim _LIBCPP_INLINE_VISIBILITY 345276792Sdim _LIBCPP_EXPLICIT operator basic_string<_CharT, _Traits, _Allocator>() const 346276792Sdim { return basic_string<_CharT, _Traits, _Allocator>( begin(), end()); } 347276792Sdim 348276792Sdim template<class _Allocator = allocator<_CharT> > 349276792Sdim _LIBCPP_INLINE_VISIBILITY 350276792Sdim basic_string<_CharT, _Traits, _Allocator> 351276792Sdim to_string( const _Allocator& __a = _Allocator()) const 352276792Sdim { return basic_string<_CharT, _Traits, _Allocator> ( begin(), end(), __a ); } 353276792Sdim 354276792Sdim size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const 355276792Sdim { 356276792Sdim if ( __pos > size()) 357276792Sdim throw out_of_range("string_view::copy"); 358276792Sdim size_type __rlen = _VSTD::min( __n, size() - __pos ); 359276792Sdim _VSTD::copy_n(begin() + __pos, __rlen, __s ); 360276792Sdim return __rlen; 361276792Sdim } 362276792Sdim 363276792Sdim _LIBCPP_CONSTEXPR 364276792Sdim basic_string_view substr(size_type __pos = 0, size_type __n = npos) const 365276792Sdim { 366276792Sdim// if (__pos > size()) 367276792Sdim// throw out_of_range("string_view::substr"); 368276792Sdim// size_type __rlen = _VSTD::min( __n, size() - __pos ); 369276792Sdim// return basic_string_view(data() + __pos, __rlen); 370276792Sdim return __pos > size() 371276792Sdim ? throw out_of_range("string_view::substr") 372276792Sdim : basic_string_view(data() + __pos, _VSTD::min(__n, size() - __pos)); 373276792Sdim } 374276792Sdim 375276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 int compare(basic_string_view __sv) const _NOEXCEPT 376276792Sdim { 377276792Sdim size_type __rlen = _VSTD::min( size(), __sv.size()); 378276792Sdim int __retval = _Traits::compare(data(), __sv.data(), __rlen); 379276792Sdim if ( __retval == 0 ) // first __rlen chars matched 380276792Sdim __retval = size() == __sv.size() ? 0 : ( size() < __sv.size() ? -1 : 1 ); 381276792Sdim return __retval; 382276792Sdim } 383276792Sdim 384276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 385276792Sdim int compare(size_type __pos1, size_type __n1, basic_string_view __sv) const 386276792Sdim { 387276792Sdim return substr(__pos1, __n1).compare(__sv); 388276792Sdim } 389276792Sdim 390276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 391276792Sdim int compare( size_type __pos1, size_type __n1, 392276792Sdim basic_string_view _sv, size_type __pos2, size_type __n2) const 393276792Sdim { 394276792Sdim return substr(__pos1, __n1).compare(_sv.substr(__pos2, __n2)); 395276792Sdim } 396276792Sdim 397276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 398276792Sdim int compare(const _CharT* __s) const 399276792Sdim { 400276792Sdim return compare(basic_string_view(__s)); 401276792Sdim } 402276792Sdim 403276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 404276792Sdim int compare(size_type __pos1, size_type __n1, const _CharT* __s) const 405276792Sdim { 406276792Sdim return substr(__pos1, __n1).compare(basic_string_view(__s)); 407276792Sdim } 408276792Sdim 409276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 410276792Sdim int compare(size_type __pos1, size_type __n1, const _CharT* __s, size_type __n2) const 411276792Sdim { 412276792Sdim return substr(__pos1, __n1).compare(basic_string_view(__s, __n2)); 413276792Sdim } 414276792Sdim 415276792Sdim // find 416276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 417276792Sdim size_type find(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT 418276792Sdim { 419276792Sdim _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): recieved nullptr"); 420276792Sdim return _VSTD::__str_find<value_type, size_type, traits_type, npos> 421276792Sdim (data(), size(), __s.data(), __pos, __s.size()); 422276792Sdim } 423276792Sdim 424276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 425276792Sdim size_type find(_CharT __c, size_type __pos = 0) const _NOEXCEPT 426276792Sdim { 427276792Sdim return _VSTD::__str_find<value_type, size_type, traits_type, npos> 428276792Sdim (data(), size(), __c, __pos); 429276792Sdim } 430276792Sdim 431276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 432276792Sdim size_type find(const _CharT* __s, size_type __pos, size_type __n) const 433276792Sdim { 434276792Sdim _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find(): recieved nullptr"); 435276792Sdim return _VSTD::__str_find<value_type, size_type, traits_type, npos> 436276792Sdim (data(), size(), __s, __pos, __n); 437276792Sdim } 438276792Sdim 439276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 440276792Sdim size_type find(const _CharT* __s, size_type __pos = 0) const 441276792Sdim { 442276792Sdim _LIBCPP_ASSERT(__s != nullptr, "string_view::find(): recieved nullptr"); 443276792Sdim return _VSTD::__str_find<value_type, size_type, traits_type, npos> 444276792Sdim (data(), size(), __s, __pos, traits_type::length(__s)); 445276792Sdim } 446276792Sdim 447276792Sdim // rfind 448276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 449276792Sdim size_type rfind(basic_string_view __s, size_type __pos = npos) const _NOEXCEPT 450276792Sdim { 451276792Sdim _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find(): recieved nullptr"); 452276792Sdim return _VSTD::__str_rfind<value_type, size_type, traits_type, npos> 453276792Sdim (data(), size(), __s.data(), __pos, __s.size()); 454276792Sdim } 455276792Sdim 456276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 457276792Sdim size_type rfind(_CharT __c, size_type __pos = npos) const _NOEXCEPT 458276792Sdim { 459276792Sdim return _VSTD::__str_rfind<value_type, size_type, traits_type, npos> 460276792Sdim (data(), size(), __c, __pos); 461276792Sdim } 462276792Sdim 463276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 464276792Sdim size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const 465276792Sdim { 466276792Sdim _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::rfind(): recieved nullptr"); 467276792Sdim return _VSTD::__str_rfind<value_type, size_type, traits_type, npos> 468276792Sdim (data(), size(), __s, __pos, __n); 469276792Sdim } 470276792Sdim 471276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 472276792Sdim size_type rfind(const _CharT* __s, size_type __pos=npos) const 473276792Sdim { 474276792Sdim _LIBCPP_ASSERT(__s != nullptr, "string_view::rfind(): recieved nullptr"); 475276792Sdim return _VSTD::__str_rfind<value_type, size_type, traits_type, npos> 476276792Sdim (data(), size(), __s, __pos, traits_type::length(__s)); 477276792Sdim } 478276792Sdim 479276792Sdim // find_first_of 480276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 481276792Sdim size_type find_first_of(basic_string_view __s, size_type __pos = 0) const _NOEXCEPT 482276792Sdim { 483276792Sdim _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_of(): recieved nullptr"); 484276792Sdim return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos> 485276792Sdim (data(), size(), __s.data(), __pos, __s.size()); 486276792Sdim } 487276792Sdim 488276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 489276792Sdim size_type find_first_of(_CharT __c, size_type __pos = 0) const _NOEXCEPT 490276792Sdim { return find(__c, __pos); } 491276792Sdim 492276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 493276792Sdim size_type find_first_of(const _CharT* __s, size_type __pos, size_type __n) const 494276792Sdim { 495276792Sdim _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_of(): recieved nullptr"); 496276792Sdim return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos> 497276792Sdim (data(), size(), __s, __pos, __n); 498276792Sdim } 499276792Sdim 500276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 501276792Sdim size_type find_first_of(const _CharT* __s, size_type __pos=0) const 502276792Sdim { 503276792Sdim _LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_of(): recieved nullptr"); 504276792Sdim return _VSTD::__str_find_first_of<value_type, size_type, traits_type, npos> 505276792Sdim (data(), size(), __s, __pos, traits_type::length(__s)); 506276792Sdim } 507276792Sdim 508276792Sdim // find_last_of 509276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 510276792Sdim size_type find_last_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT 511276792Sdim { 512276792Sdim _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_of(): recieved nullptr"); 513276792Sdim return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos> 514276792Sdim (data(), size(), __s.data(), __pos, __s.size()); 515276792Sdim } 516276792Sdim 517276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 518276792Sdim size_type find_last_of(_CharT __c, size_type __pos = npos) const _NOEXCEPT 519276792Sdim { return rfind(__c, __pos); } 520276792Sdim 521276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 522276792Sdim size_type find_last_of(const _CharT* __s, size_type __pos, size_type __n) const 523276792Sdim { 524276792Sdim _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_of(): recieved nullptr"); 525276792Sdim return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos> 526276792Sdim (data(), size(), __s, __pos, __n); 527276792Sdim } 528276792Sdim 529276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 530276792Sdim size_type find_last_of(const _CharT* __s, size_type __pos=npos) const 531276792Sdim { 532276792Sdim _LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_of(): recieved nullptr"); 533276792Sdim return _VSTD::__str_find_last_of<value_type, size_type, traits_type, npos> 534276792Sdim (data(), size(), __s, __pos, traits_type::length(__s)); 535276792Sdim } 536276792Sdim 537276792Sdim // find_first_not_of 538276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 539276792Sdim size_type find_first_not_of(basic_string_view __s, size_type __pos=0) const _NOEXCEPT 540276792Sdim { 541276792Sdim _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_first_not_of(): recieved nullptr"); 542276792Sdim return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos> 543276792Sdim (data(), size(), __s.data(), __pos, __s.size()); 544276792Sdim } 545276792Sdim 546276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 547276792Sdim size_type find_first_not_of(_CharT __c, size_type __pos=0) const _NOEXCEPT 548276792Sdim { 549276792Sdim return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos> 550276792Sdim (data(), size(), __c, __pos); 551276792Sdim } 552276792Sdim 553276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 554276792Sdim size_type find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const 555276792Sdim { 556276792Sdim _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_first_not_of(): recieved nullptr"); 557276792Sdim return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos> 558276792Sdim (data(), size(), __s, __pos, __n); 559276792Sdim } 560276792Sdim 561276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 562276792Sdim size_type find_first_not_of(const _CharT* __s, size_type __pos=0) const 563276792Sdim { 564276792Sdim _LIBCPP_ASSERT(__s != nullptr, "string_view::find_first_not_of(): recieved nullptr"); 565276792Sdim return _VSTD::__str_find_first_not_of<value_type, size_type, traits_type, npos> 566276792Sdim (data(), size(), __s, __pos, traits_type::length(__s)); 567276792Sdim } 568276792Sdim 569276792Sdim // find_last_not_of 570276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 571276792Sdim size_type find_last_not_of(basic_string_view __s, size_type __pos=npos) const _NOEXCEPT 572276792Sdim { 573276792Sdim _LIBCPP_ASSERT(__s.size() == 0 || __s.data() != nullptr, "string_view::find_last_not_of(): recieved nullptr"); 574276792Sdim return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos> 575276792Sdim (data(), size(), __s.data(), __pos, __s.size()); 576276792Sdim } 577276792Sdim 578276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 579276792Sdim size_type find_last_not_of(_CharT __c, size_type __pos=npos) const _NOEXCEPT 580276792Sdim { 581276792Sdim return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos> 582276792Sdim (data(), size(), __c, __pos); 583276792Sdim } 584276792Sdim 585276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 586276792Sdim size_type find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const 587276792Sdim { 588276792Sdim _LIBCPP_ASSERT(__n == 0 || __s != nullptr, "string_view::find_last_not_of(): recieved nullptr"); 589276792Sdim return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos> 590276792Sdim (data(), size(), __s, __pos, __n); 591276792Sdim } 592276792Sdim 593276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 594276792Sdim size_type find_last_not_of(const _CharT* __s, size_type __pos=npos) const 595276792Sdim { 596276792Sdim _LIBCPP_ASSERT(__s != nullptr, "string_view::find_last_not_of(): recieved nullptr"); 597276792Sdim return _VSTD::__str_find_last_not_of<value_type, size_type, traits_type, npos> 598276792Sdim (data(), size(), __s, __pos, traits_type::length(__s)); 599276792Sdim } 600276792Sdim 601276792Sdim private: 602276792Sdim const value_type* __data; 603276792Sdim size_type __size; 604276792Sdim }; 605276792Sdim 606276792Sdim 607276792Sdim // [string.view.comparison] 608276792Sdim // operator == 609276792Sdim template<class _CharT, class _Traits> 610276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 611276792Sdim bool operator==(basic_string_view<_CharT, _Traits> __lhs, 612276792Sdim basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 613276792Sdim { 614276792Sdim if ( __lhs.size() != __rhs.size()) return false; 615276792Sdim return __lhs.compare(__rhs) == 0; 616276792Sdim } 617276792Sdim 618276792Sdim template<class _CharT, class _Traits> 619276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 620276792Sdim bool operator==(basic_string_view<_CharT, _Traits> __lhs, 621276792Sdim typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 622276792Sdim { 623276792Sdim if ( __lhs.size() != __rhs.size()) return false; 624276792Sdim return __lhs.compare(__rhs) == 0; 625276792Sdim } 626276792Sdim 627276792Sdim template<class _CharT, class _Traits> 628276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 629276792Sdim bool operator==(typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 630276792Sdim basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 631276792Sdim { 632276792Sdim if ( __lhs.size() != __rhs.size()) return false; 633276792Sdim return __lhs.compare(__rhs) == 0; 634276792Sdim } 635276792Sdim 636276792Sdim 637276792Sdim // operator != 638276792Sdim template<class _CharT, class _Traits> 639276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 640276792Sdim bool operator!=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 641276792Sdim { 642276792Sdim if ( __lhs.size() != __rhs.size()) 643276792Sdim return true; 644276792Sdim return __lhs.compare(__rhs) != 0; 645276792Sdim } 646276792Sdim 647276792Sdim template<class _CharT, class _Traits> 648276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 649276792Sdim bool operator!=(basic_string_view<_CharT, _Traits> __lhs, 650276792Sdim typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 651276792Sdim { 652276792Sdim if ( __lhs.size() != __rhs.size()) 653276792Sdim return true; 654276792Sdim return __lhs.compare(__rhs) != 0; 655276792Sdim } 656276792Sdim 657276792Sdim template<class _CharT, class _Traits> 658276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 659276792Sdim bool operator!=(typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 660276792Sdim basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 661276792Sdim { 662276792Sdim if ( __lhs.size() != __rhs.size()) 663276792Sdim return true; 664276792Sdim return __lhs.compare(__rhs) != 0; 665276792Sdim } 666276792Sdim 667276792Sdim 668276792Sdim // operator < 669276792Sdim template<class _CharT, class _Traits> 670276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 671276792Sdim bool operator<(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 672276792Sdim { 673276792Sdim return __lhs.compare(__rhs) < 0; 674276792Sdim } 675276792Sdim 676276792Sdim template<class _CharT, class _Traits> 677276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 678276792Sdim bool operator<(basic_string_view<_CharT, _Traits> __lhs, 679276792Sdim typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 680276792Sdim { 681276792Sdim return __lhs.compare(__rhs) < 0; 682276792Sdim } 683276792Sdim 684276792Sdim template<class _CharT, class _Traits> 685276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 686276792Sdim bool operator<(typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 687276792Sdim basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 688276792Sdim { 689276792Sdim return __lhs.compare(__rhs) < 0; 690276792Sdim } 691276792Sdim 692276792Sdim 693276792Sdim // operator > 694276792Sdim template<class _CharT, class _Traits> 695276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 696276792Sdim bool operator> (basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 697276792Sdim { 698276792Sdim return __lhs.compare(__rhs) > 0; 699276792Sdim } 700276792Sdim 701276792Sdim template<class _CharT, class _Traits> 702276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 703276792Sdim bool operator>(basic_string_view<_CharT, _Traits> __lhs, 704276792Sdim typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 705276792Sdim { 706276792Sdim return __lhs.compare(__rhs) > 0; 707276792Sdim } 708276792Sdim 709276792Sdim template<class _CharT, class _Traits> 710276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 711276792Sdim bool operator>(typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 712276792Sdim basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 713276792Sdim { 714276792Sdim return __lhs.compare(__rhs) > 0; 715276792Sdim } 716276792Sdim 717276792Sdim 718276792Sdim // operator <= 719276792Sdim template<class _CharT, class _Traits> 720276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 721276792Sdim bool operator<=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 722276792Sdim { 723276792Sdim return __lhs.compare(__rhs) <= 0; 724276792Sdim } 725276792Sdim 726276792Sdim template<class _CharT, class _Traits> 727276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 728276792Sdim bool operator<=(basic_string_view<_CharT, _Traits> __lhs, 729276792Sdim typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 730276792Sdim { 731276792Sdim return __lhs.compare(__rhs) <= 0; 732276792Sdim } 733276792Sdim 734276792Sdim template<class _CharT, class _Traits> 735276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 736276792Sdim bool operator<=(typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 737276792Sdim basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 738276792Sdim { 739276792Sdim return __lhs.compare(__rhs) <= 0; 740276792Sdim } 741276792Sdim 742276792Sdim 743276792Sdim // operator >= 744276792Sdim template<class _CharT, class _Traits> 745276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 746276792Sdim bool operator>=(basic_string_view<_CharT, _Traits> __lhs, basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 747276792Sdim { 748276792Sdim return __lhs.compare(__rhs) >= 0; 749276792Sdim } 750276792Sdim 751276792Sdim 752276792Sdim template<class _CharT, class _Traits> 753276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 754276792Sdim bool operator>=(basic_string_view<_CharT, _Traits> __lhs, 755276792Sdim typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __rhs) _NOEXCEPT 756276792Sdim { 757276792Sdim return __lhs.compare(__rhs) >= 0; 758276792Sdim } 759276792Sdim 760276792Sdim template<class _CharT, class _Traits> 761276792Sdim _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 762276792Sdim bool operator>=(typename _VSTD::common_type<basic_string_view<_CharT, _Traits> >::type __lhs, 763276792Sdim basic_string_view<_CharT, _Traits> __rhs) _NOEXCEPT 764276792Sdim { 765276792Sdim return __lhs.compare(__rhs) >= 0; 766276792Sdim } 767276792Sdim 768276792Sdim 769276792Sdim // [string.view.io] 770276792Sdim template<class _CharT, class _Traits> 771276792Sdim basic_ostream<_CharT, _Traits>& 772276792Sdim operator<<(basic_ostream<_CharT, _Traits>& __os, basic_string_view<_CharT, _Traits> __sv) 773276792Sdim { 774276792Sdim return _VSTD::__put_character_sequence(__os, __sv.data(), __sv.size()); 775276792Sdim } 776276792Sdim 777276792Sdim typedef basic_string_view<char> string_view; 778276792Sdim typedef basic_string_view<char16_t> u16string_view; 779276792Sdim typedef basic_string_view<char32_t> u32string_view; 780276792Sdim typedef basic_string_view<wchar_t> wstring_view; 781276792Sdim 782276792Sdim_LIBCPP_END_NAMESPACE_LFTS 783276792Sdim_LIBCPP_BEGIN_NAMESPACE_STD 784276792Sdim 785276792Sdim// [string.view.hash] 786276792Sdim// Shamelessly stolen from <string> 787276792Sdimtemplate<class _CharT, class _Traits> 788276792Sdimstruct _LIBCPP_TYPE_VIS_ONLY hash<std::experimental::basic_string_view<_CharT, _Traits> > 789276792Sdim : public unary_function<std::experimental::basic_string_view<_CharT, _Traits>, size_t> 790276792Sdim{ 791276792Sdim size_t operator()(const std::experimental::basic_string_view<_CharT, _Traits>& __val) const _NOEXCEPT; 792276792Sdim}; 793276792Sdim 794276792Sdimtemplate<class _CharT, class _Traits> 795276792Sdimsize_t 796276792Sdimhash<std::experimental::basic_string_view<_CharT, _Traits> >::operator()( 797276792Sdim const std::experimental::basic_string_view<_CharT, _Traits>& __val) const _NOEXCEPT 798276792Sdim{ 799276792Sdim return __do_string_hash(__val.data(), __val.data() + __val.size()); 800276792Sdim} 801276792Sdim 802276792Sdim#if _LIBCPP_STD_VER > 11 803276792Sdimtemplate <class _CharT, class _Traits> 804276792Sdim__quoted_output_proxy<_CharT, const _CharT *, _Traits> 805276792Sdimquoted ( std::experimental::basic_string_view <_CharT, _Traits> __sv, 806276792Sdim _CharT __delim = _CharT('"'), _CharT __escape=_CharT('\\')) 807276792Sdim{ 808276792Sdim return __quoted_output_proxy<_CharT, const _CharT *, _Traits> 809276792Sdim ( __sv.data(), __sv.data() + __sv.size(), __delim, __escape ); 810276792Sdim} 811276792Sdim#endif 812276792Sdim 813276792Sdim_LIBCPP_END_NAMESPACE_STD 814276792Sdim 815276792Sdim#endif // _LIBCPP_LFTS_STRING_VIEW 816