Where Online Learning is simpler!
The C and C++ Include Header Files
/usr/include/c++/11/experimental/string_view
$ cat -n /usr/include/c++/11/experimental/string_view 1 // Components for manipulating non-owning sequences of characters -*- C++ -*- 2 3 // Copyright (C) 2013-2021 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 //
. 24 25 /** @file experimental/string_view 26 * This is a TS C++ Library header. 27 * @ingroup libfund-ts 28 */ 29 30 // 31 // N3762 basic_string_view library 32 // 33 34 #ifndef _GLIBCXX_EXPERIMENTAL_STRING_VIEW 35 #define _GLIBCXX_EXPERIMENTAL_STRING_VIEW 1 36 37 #pragma GCC system_header 38 39 #if __cplusplus >= 201402L 40 41 #include
42 #include
43 #include
// enable_borrowed_range, enable_view 44 #include
45 46 namespace std _GLIBCXX_VISIBILITY(default) 47 { 48 _GLIBCXX_BEGIN_NAMESPACE_VERSION 49 50 namespace experimental 51 { 52 inline namespace fundamentals_v1 53 { 54 #define __cpp_lib_experimental_string_view 201411 55 56 /** 57 * @class basic_string_view
58 * @brief A non-owning reference to a string. 59 * 60 * @ingroup strings 61 * @ingroup sequences 62 * @ingroup libfund-ts 63 * 64 * @tparam _CharT Type of character 65 * @tparam _Traits Traits for character type, defaults to 66 * char_traits<_CharT>. 67 * 68 * A basic_string_view looks like this: 69 * 70 * @code 71 * _CharT* _M_str 72 * size_t _M_len 73 * @endcode 74 */ 75 template
> 76 class basic_string_view 77 { 78 public: 79 80 // types 81 using traits_type = _Traits; 82 using value_type = _CharT; 83 using pointer = _CharT*; 84 using const_pointer = const _CharT*; 85 using reference = _CharT&; 86 using const_reference = const _CharT&; 87 using const_iterator = const _CharT*; 88 using iterator = const_iterator; 89 using const_reverse_iterator = std::reverse_iterator
; 90 using reverse_iterator = const_reverse_iterator; 91 using size_type = size_t; 92 using difference_type = ptrdiff_t; 93 static constexpr size_type npos = size_type(-1); 94 95 // [string.view.cons], construct/copy 96 97 constexpr 98 basic_string_view() noexcept 99 : _M_len{0}, _M_str{nullptr} 100 { } 101 102 constexpr basic_string_view(const basic_string_view&) noexcept = default; 103 104 template
105 basic_string_view(const basic_string<_CharT, _Traits, 106 _Allocator>& __str) noexcept 107 : _M_len{__str.length()}, _M_str{__str.data()} 108 { } 109 110 constexpr basic_string_view(const _CharT* __str) 111 : _M_len{__str == nullptr ? 0 : traits_type::length(__str)}, 112 _M_str{__str} 113 { } 114 115 constexpr basic_string_view(const _CharT* __str, size_type __len) 116 : _M_len{__len}, 117 _M_str{__str} 118 { } 119 120 basic_string_view& 121 operator=(const basic_string_view&) noexcept = default; 122 123 // [string.view.iterators], iterators 124 125 constexpr const_iterator 126 begin() const noexcept 127 { return this->_M_str; } 128 129 constexpr const_iterator 130 end() const noexcept 131 { return this->_M_str + this->_M_len; } 132 133 constexpr const_iterator 134 cbegin() const noexcept 135 { return this->_M_str; } 136 137 constexpr const_iterator 138 cend() const noexcept 139 { return this->_M_str + this->_M_len; } 140 141 const_reverse_iterator 142 rbegin() const noexcept 143 { return const_reverse_iterator(this->end()); } 144 145 const_reverse_iterator 146 rend() const noexcept 147 { return const_reverse_iterator(this->begin()); } 148 149 const_reverse_iterator 150 crbegin() const noexcept 151 { return const_reverse_iterator(this->end()); } 152 153 const_reverse_iterator 154 crend() const noexcept 155 { return const_reverse_iterator(this->begin()); } 156 157 // [string.view.capacity], capacity 158 159 constexpr size_type 160 size() const noexcept 161 { return this->_M_len; } 162 163 constexpr size_type 164 length() const noexcept 165 { return _M_len; } 166 167 constexpr size_type 168 max_size() const noexcept 169 { 170 return (npos - sizeof(size_type) - sizeof(void*)) 171 / sizeof(value_type) / 4; 172 } 173 174 _GLIBCXX_NODISCARD constexpr bool 175 empty() const noexcept 176 { return this->_M_len == 0; } 177 178 // [string.view.access], element access 179 180 constexpr const _CharT& 181 operator[](size_type __pos) const 182 { 183 __glibcxx_assert(__pos < this->_M_len); 184 return *(this->_M_str + __pos); 185 } 186 187 constexpr const _CharT& 188 at(size_type __pos) const 189 { 190 return __pos < this->_M_len 191 ? *(this->_M_str + __pos) 192 : (__throw_out_of_range_fmt(__N("basic_string_view::at: __pos " 193 "(which is %zu) >= this->size() " 194 "(which is %zu)"), 195 __pos, this->size()), 196 *this->_M_str); 197 } 198 199 constexpr const _CharT& 200 front() const 201 { 202 __glibcxx_assert(this->_M_len > 0); 203 return *this->_M_str; 204 } 205 206 constexpr const _CharT& 207 back() const 208 { 209 __glibcxx_assert(this->_M_len > 0); 210 return *(this->_M_str + this->_M_len - 1); 211 } 212 213 constexpr const _CharT* 214 data() const noexcept 215 { return this->_M_str; } 216 217 // [string.view.modifiers], modifiers: 218 219 constexpr void 220 remove_prefix(size_type __n) 221 { 222 __glibcxx_assert(this->_M_len >= __n); 223 this->_M_str += __n; 224 this->_M_len -= __n; 225 } 226 227 constexpr void 228 remove_suffix(size_type __n) 229 { this->_M_len -= __n; } 230 231 constexpr void 232 swap(basic_string_view& __sv) noexcept 233 { 234 auto __tmp = *this; 235 *this = __sv; 236 __sv = __tmp; 237 } 238 239 240 // [string.view.ops], string operations: 241 242 template
243 explicit operator basic_string<_CharT, _Traits, _Allocator>() const 244 { 245 return { this->_M_str, this->_M_len }; 246 } 247 248 template
> 249 basic_string<_CharT, _Traits, _Allocator> 250 to_string(const _Allocator& __alloc = _Allocator()) const 251 { 252 return { this->_M_str, this->_M_len, __alloc }; 253 } 254 255 size_type 256 copy(_CharT* __str, size_type __n, size_type __pos = 0) const 257 { 258 __glibcxx_requires_string_len(__str, __n); 259 if (__pos > this->_M_len) 260 __throw_out_of_range_fmt(__N("basic_string_view::copy: __pos " 261 "(which is %zu) > this->size() " 262 "(which is %zu)"), 263 __pos, this->size()); 264 size_type __rlen{std::min(__n, size_type{this->_M_len - __pos})}; 265 for (auto __begin = this->_M_str + __pos, 266 __end = __begin + __rlen; __begin != __end;) 267 *__str++ = *__begin++; 268 return __rlen; 269 } 270 271 272 // [string.view.ops], string operations: 273 274 constexpr basic_string_view 275 substr(size_type __pos = 0, size_type __n = npos) const 276 { 277 return __pos <= this->_M_len 278 ? basic_string_view{this->_M_str + __pos, 279 std::min(__n, size_type{this->_M_len - __pos})} 280 : (__throw_out_of_range_fmt(__N("basic_string_view::substr: __pos " 281 "(which is %zu) > this->size() " 282 "(which is %zu)"), 283 __pos, this->size()), basic_string_view{}); 284 } 285 286 constexpr int 287 compare(basic_string_view __str) const noexcept 288 { 289 int __ret = traits_type::compare(this->_M_str, __str._M_str, 290 std::min(this->_M_len, __str._M_len)); 291 if (__ret == 0) 292 __ret = _S_compare(this->_M_len, __str._M_len); 293 return __ret; 294 } 295 296 constexpr int 297 compare(size_type __pos1, size_type __n1, basic_string_view __str) const 298 { return this->substr(__pos1, __n1).compare(__str); } 299 300 constexpr int 301 compare(size_type __pos1, size_type __n1, 302 basic_string_view __str, size_type __pos2, size_type __n2) const 303 { return this->substr(__pos1, __n1).compare(__str.substr(__pos2, __n2)); } 304 305 constexpr int 306 compare(const _CharT* __str) const noexcept 307 { return this->compare(basic_string_view{__str}); } 308 309 constexpr int 310 compare(size_type __pos1, size_type __n1, const _CharT* __str) const 311 { return this->substr(__pos1, __n1).compare(basic_string_view{__str}); } 312 313 constexpr int 314 compare(size_type __pos1, size_type __n1, 315 const _CharT* __str, size_type __n2) const 316 { 317 return this->substr(__pos1, __n1) 318 .compare(basic_string_view(__str, __n2)); 319 } 320 321 constexpr size_type 322 find(basic_string_view __str, size_type __pos = 0) const noexcept 323 { return this->find(__str._M_str, __pos, __str._M_len); } 324 325 constexpr size_type 326 find(_CharT __c, size_type __pos=0) const noexcept; 327 328 constexpr size_type 329 find(const _CharT* __str, size_type __pos, size_type __n) const noexcept; 330 331 constexpr size_type 332 find(const _CharT* __str, size_type __pos=0) const noexcept 333 { return this->find(__str, __pos, traits_type::length(__str)); } 334 335 constexpr size_type 336 rfind(basic_string_view __str, size_type __pos = npos) const noexcept 337 { return this->rfind(__str._M_str, __pos, __str._M_len); } 338 339 constexpr size_type 340 rfind(_CharT __c, size_type __pos = npos) const noexcept; 341 342 constexpr size_type 343 rfind(const _CharT* __str, size_type __pos, size_type __n) const noexcept; 344 345 constexpr size_type 346 rfind(const _CharT* __str, size_type __pos = npos) const noexcept 347 { return this->rfind(__str, __pos, traits_type::length(__str)); } 348 349 constexpr size_type 350 find_first_of(basic_string_view __str, size_type __pos = 0) const noexcept 351 { return this->find_first_of(__str._M_str, __pos, __str._M_len); } 352 353 constexpr size_type 354 find_first_of(_CharT __c, size_type __pos = 0) const noexcept 355 { return this->find(__c, __pos); } 356 357 constexpr size_type 358 find_first_of(const _CharT* __str, size_type __pos, size_type __n) const; 359 360 constexpr size_type 361 find_first_of(const _CharT* __str, size_type __pos = 0) const noexcept 362 { return this->find_first_of(__str, __pos, traits_type::length(__str)); } 363 364 constexpr size_type 365 find_last_of(basic_string_view __str, 366 size_type __pos = npos) const noexcept 367 { return this->find_last_of(__str._M_str, __pos, __str._M_len); } 368 369 constexpr size_type 370 find_last_of(_CharT __c, size_type __pos=npos) const noexcept 371 { return this->rfind(__c, __pos); } 372 373 constexpr size_type 374 find_last_of(const _CharT* __str, size_type __pos, size_type __n) const; 375 376 constexpr size_type 377 find_last_of(const _CharT* __str, size_type __pos = npos) const noexcept 378 { return this->find_last_of(__str, __pos, traits_type::length(__str)); } 379 380 constexpr size_type 381 find_first_not_of(basic_string_view __str, 382 size_type __pos = 0) const noexcept 383 { return this->find_first_not_of(__str._M_str, __pos, __str._M_len); } 384 385 constexpr size_type 386 find_first_not_of(_CharT __c, size_type __pos = 0) const noexcept; 387 388 constexpr size_type 389 find_first_not_of(const _CharT* __str, 390 size_type __pos, size_type __n) const; 391 392 constexpr size_type 393 find_first_not_of(const _CharT* __str, size_type __pos = 0) const noexcept 394 { 395 return this->find_first_not_of(__str, __pos, 396 traits_type::length(__str)); 397 } 398 399 constexpr size_type 400 find_last_not_of(basic_string_view __str, 401 size_type __pos = npos) const noexcept 402 { return this->find_last_not_of(__str._M_str, __pos, __str._M_len); } 403 404 constexpr size_type 405 find_last_not_of(_CharT __c, size_type __pos = npos) const noexcept; 406 407 constexpr size_type 408 find_last_not_of(const _CharT* __str, 409 size_type __pos, size_type __n) const; 410 411 constexpr size_type 412 find_last_not_of(const _CharT* __str, 413 size_type __pos = npos) const noexcept 414 { 415 return this->find_last_not_of(__str, __pos, 416 traits_type::length(__str)); 417 } 418 419 private: 420 421 static constexpr int 422 _S_compare(size_type __n1, size_type __n2) noexcept 423 { 424 return difference_type(__n1 - __n2) > std::numeric_limits
::max() 425 ? std::numeric_limits
::max() 426 : difference_type(__n1 - __n2) < std::numeric_limits
::min() 427 ? std::numeric_limits
::min() 428 : static_cast
(difference_type(__n1 - __n2)); 429 } 430 431 size_t _M_len; 432 const _CharT* _M_str; 433 }; 434 435 // [string.view.comparison], non-member basic_string_view comparison functions 436 437 // Several of these functions use type_identity_t to create a non-deduced 438 // context, so that only one argument participates in template argument 439 // deduction and the other argument gets implicitly converted to the deduced 440 // type (see N3766). 441 442 template
443 constexpr bool 444 operator==(basic_string_view<_CharT, _Traits> __x, 445 basic_string_view<_CharT, _Traits> __y) noexcept 446 { return __x.size() == __y.size() && __x.compare(__y) == 0; } 447 448 template
449 constexpr bool 450 operator==(basic_string_view<_CharT, _Traits> __x, 451 __type_identity_t
> __y) 452 noexcept 453 { return __x.size() == __y.size() && __x.compare(__y) == 0; } 454 455 template
456 constexpr bool 457 operator==(__type_identity_t
> __x, 458 basic_string_view<_CharT, _Traits> __y) noexcept 459 { return __x.size() == __y.size() && __x.compare(__y) == 0; } 460 461 template
462 constexpr bool 463 operator!=(basic_string_view<_CharT, _Traits> __x, 464 basic_string_view<_CharT, _Traits> __y) noexcept 465 { return !(__x == __y); } 466 467 template
468 constexpr bool 469 operator!=(basic_string_view<_CharT, _Traits> __x, 470 __type_identity_t
> __y) 471 noexcept 472 { return !(__x == __y); } 473 474 template
475 constexpr bool 476 operator!=(__type_identity_t
> __x, 477 basic_string_view<_CharT, _Traits> __y) noexcept 478 { return !(__x == __y); } 479 480 template
481 constexpr bool 482 operator< (basic_string_view<_CharT, _Traits> __x, 483 basic_string_view<_CharT, _Traits> __y) noexcept 484 { return __x.compare(__y) < 0; } 485 486 template
487 constexpr bool 488 operator< (basic_string_view<_CharT, _Traits> __x, 489 __type_identity_t
> __y) 490 noexcept 491 { return __x.compare(__y) < 0; } 492 493 template
494 constexpr bool 495 operator< (__type_identity_t
> __x, 496 basic_string_view<_CharT, _Traits> __y) noexcept 497 { return __x.compare(__y) < 0; } 498 499 template
500 constexpr bool 501 operator> (basic_string_view<_CharT, _Traits> __x, 502 basic_string_view<_CharT, _Traits> __y) noexcept 503 { return __x.compare(__y) > 0; } 504 505 template
506 constexpr bool 507 operator> (basic_string_view<_CharT, _Traits> __x, 508 __type_identity_t
> __y) 509 noexcept 510 { return __x.compare(__y) > 0; } 511 512 template
513 constexpr bool 514 operator> (__type_identity_t
> __x, 515 basic_string_view<_CharT, _Traits> __y) noexcept 516 { return __x.compare(__y) > 0; } 517 518 template
519 constexpr bool 520 operator<=(basic_string_view<_CharT, _Traits> __x, 521 basic_string_view<_CharT, _Traits> __y) noexcept 522 { return __x.compare(__y) <= 0; } 523 524 template
525 constexpr bool 526 operator<=(basic_string_view<_CharT, _Traits> __x, 527 __type_identity_t
> __y) 528 noexcept 529 { return __x.compare(__y) <= 0; } 530 531 template
532 constexpr bool 533 operator<=(__type_identity_t
> __x, 534 basic_string_view<_CharT, _Traits> __y) noexcept 535 { return __x.compare(__y) <= 0; } 536 537 template
538 constexpr bool 539 operator>=(basic_string_view<_CharT, _Traits> __x, 540 basic_string_view<_CharT, _Traits> __y) noexcept 541 { return __x.compare(__y) >= 0; } 542 543 template
544 constexpr bool 545 operator>=(basic_string_view<_CharT, _Traits> __x, 546 __type_identity_t
> __y) 547 noexcept 548 { return __x.compare(__y) >= 0; } 549 550 template
551 constexpr bool 552 operator>=(__type_identity_t
> __x, 553 basic_string_view<_CharT, _Traits> __y) noexcept 554 { return __x.compare(__y) >= 0; } 555 556 // [string.view.io], Inserters and extractors 557 template
558 inline basic_ostream<_CharT, _Traits>& 559 operator<<(basic_ostream<_CharT, _Traits>& __os, 560 basic_string_view<_CharT,_Traits> __str) 561 { return __ostream_insert(__os, __str.data(), __str.size()); } 562 563 564 // basic_string_view typedef names 565 566 using string_view = basic_string_view
; 567 #ifdef _GLIBCXX_USE_WCHAR_T 568 using wstring_view = basic_string_view
; 569 #endif 570 #ifdef _GLIBCXX_USE_CHAR8_T 571 using u8string_view = basic_string_view
; 572 #endif 573 using u16string_view = basic_string_view
; 574 using u32string_view = basic_string_view
; 575 } // namespace fundamentals_v1 576 } // namespace experimental 577 578 579 // [string.view.hash], hash support: 580 template
581 struct hash; 582 583 template<> 584 struct hash
585 : public __hash_base
586 { 587 size_t 588 operator()(const experimental::string_view& __str) const noexcept 589 { return std::_Hash_impl::hash(__str.data(), __str.length()); } 590 }; 591 592 template<> 593 struct __is_fast_hash
> : std::false_type 594 { }; 595 596 #ifdef _GLIBCXX_USE_WCHAR_T 597 template<> 598 struct hash
599 : public __hash_base
600 { 601 size_t 602 operator()(const experimental::wstring_view& __s) const noexcept 603 { return std::_Hash_impl::hash(__s.data(), 604 __s.length() * sizeof(wchar_t)); } 605 }; 606 607 template<> 608 struct __is_fast_hash
> : std::false_type 609 { }; 610 #endif 611 612 #ifdef _GLIBCXX_USE_CHAR8_T 613 template<> 614 struct hash
615 : public __hash_base
616 { 617 size_t 618 operator()(const experimental::u8string_view& __s) const noexcept 619 { return std::_Hash_impl::hash(__s.data(), __s.length()); } 620 }; 621 622 template<> 623 struct __is_fast_hash
> : std::false_type 624 { }; 625 #endif 626 627 template<> 628 struct hash
629 : public __hash_base
630 { 631 size_t 632 operator()(const experimental::u16string_view& __s) const noexcept 633 { return std::_Hash_impl::hash(__s.data(), 634 __s.length() * sizeof(char16_t)); } 635 }; 636 637 template<> 638 struct __is_fast_hash
> : std::false_type 639 { }; 640 641 template<> 642 struct hash
643 : public __hash_base
644 { 645 size_t 646 operator()(const experimental::u32string_view& __s) const noexcept 647 { return std::_Hash_impl::hash(__s.data(), 648 __s.length() * sizeof(char32_t)); } 649 }; 650 651 template<> 652 struct __is_fast_hash
> : std::false_type 653 { }; 654 655 namespace experimental 656 { 657 // I added these EMSR. 658 inline namespace literals 659 { 660 inline namespace string_view_literals 661 { 662 #pragma GCC diagnostic push 663 #pragma GCC diagnostic ignored "-Wliteral-suffix" 664 inline constexpr basic_string_view
665 operator""sv(const char* __str, size_t __len) noexcept 666 { return basic_string_view
{__str, __len}; } 667 668 #ifdef _GLIBCXX_USE_WCHAR_T 669 inline constexpr basic_string_view
670 operator""sv(const wchar_t* __str, size_t __len) noexcept 671 { return basic_string_view
{__str, __len}; } 672 #endif 673 674 #ifdef _GLIBCXX_USE_CHAR8_T 675 inline constexpr basic_string_view
676 operator""sv(const char8_t* __str, size_t __len) noexcept 677 { return basic_string_view
{__str, __len}; } 678 #endif 679 680 inline constexpr basic_string_view
681 operator""sv(const char16_t* __str, size_t __len) noexcept 682 { return basic_string_view
{__str, __len}; } 683 684 inline constexpr basic_string_view
685 operator""sv(const char32_t* __str, size_t __len) noexcept 686 { return basic_string_view
{__str, __len}; } 687 #pragma GCC diagnostic pop 688 } // namespace string_literals 689 } // namespace literals 690 } // namespace experimental 691 692 #if __cpp_lib_concepts 693 namespace ranges 694 { 695 // Opt-in to borrowed_range concept 696 template
697 inline constexpr bool 698 enable_borrowed_range
> 699 = true; 700 701 // Opt-in to view concept 702 template
703 inline constexpr bool 704 enable_view
> = true; 705 } 706 #endif 707 708 _GLIBCXX_END_NAMESPACE_VERSION 709 } // namespace std 710 711 #include
712 713 #endif // __cplusplus <= 201103L 714 715 #endif // _GLIBCXX_EXPERIMENTAL_STRING_VIEW
Contact us
|
About us
|
Term of use
|
Copyright © 2000-2025 MyWebUniversity.com ™