// -*- C++ -*- //===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef _LIBCPP_STRING_VIEW #define _LIBCPP_STRING_VIEW // clang-format off /* string_view synopsis #include <compare> namespace std { // 7.2, Class template basic_string_view template<class charT, class traits = char_traits<charT>> class basic_string_view; template<class charT, class traits> inline constexpr bool ranges::enable_view<basic_string_view<charT, traits>> = true; template<class charT, class traits> inline constexpr bool ranges::enable_borrowed_range<basic_string_view<charT, traits>> = true; // C++20 // 7.9, basic_string_view non-member comparison functions template<class charT, class traits> constexpr bool operator==(basic_string_view<charT, traits> x, basic_string_view<charT, traits> y) noexcept; template<class charT, class traits> // Removed in C++20 constexpr bool operator!=(basic_string_view<charT, traits> x, basic_string_view<charT, traits> y) noexcept; template<class charT, class traits> // Removed in C++20 constexpr bool operator< (basic_string_view<charT, traits> x, basic_string_view<charT, traits> y) noexcept; template<class charT, class traits> // Removed in C++20 constexpr bool operator> (basic_string_view<charT, traits> x, basic_string_view<charT, traits> y) noexcept; template<class charT, class traits> // Removed in C++20 constexpr bool operator<=(basic_string_view<charT, traits> x, basic_string_view<charT, traits> y) noexcept; template<class charT, class traits> // Removed in C++20 constexpr bool operator>=(basic_string_view<charT, traits> x, basic_string_view<charT, traits> y) noexcept; template<class charT, class traits> // Since C++20 constexpr see below operator<=>(basic_string_view<charT, traits> x, basic_string_view<charT, traits> y) noexcept; // see below, sufficient additional overloads of comparison functions // 7.10, Inserters and extractors template<class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, basic_string_view<charT, traits> str); // basic_string_view typedef names typedef basic_string_view<char> string_view; typedef basic_string_view<char8_t> u8string_view; // C++20 typedef basic_string_view<char16_t> u16string_view; typedef basic_string_view<char32_t> u32string_view; typedef basic_string_view<wchar_t> wstring_view; template<class charT, class traits = char_traits<charT>> class basic_string_view { public: // types typedef traits traits_type; typedef charT value_type; typedef charT* pointer; typedef const charT* const_pointer; typedef charT& reference; typedef const charT& const_reference; typedef implementation-defined const_iterator; typedef const_iterator iterator; typedef reverse_iterator<const_iterator> const_reverse_iterator; typedef const_reverse_iterator reverse_iterator; typedef size_t size_type; typedef ptrdiff_t difference_type; static constexpr size_type npos = size_type(-1); // 7.3, basic_string_view constructors and assignment operators constexpr basic_string_view() noexcept; constexpr basic_string_view(const basic_string_view&) noexcept = default; basic_string_view& operator=(const basic_string_view&) noexcept = default; template<class Allocator> constexpr basic_string_view(const charT* str); basic_string_view(nullptr_t) = delete; // C++23 constexpr basic_string_view(const charT* str, size_type len); template <class It, class End> constexpr basic_string_view(It begin, End end); // C++20 template <class Range> constexpr basic_string_view(Range&& r); // C++23 // 7.4, basic_string_view iterator support constexpr const_iterator begin() const noexcept; constexpr const_iterator end() const noexcept; constexpr const_iterator cbegin() const noexcept; constexpr const_iterator cend() const noexcept; const_reverse_iterator rbegin() const noexcept; const_reverse_iterator rend() const noexcept; const_reverse_iterator crbegin() const noexcept; const_reverse_iterator crend() const noexcept; // 7.5, basic_string_view capacity constexpr size_type size() const noexcept; constexpr size_type length() const noexcept; constexpr size_type max_size() const noexcept; constexpr bool empty() const noexcept; // 7.6, basic_string_view element access constexpr const_reference operator[](size_type pos) const; constexpr const_reference at(size_type pos) const; constexpr const_reference front() const; constexpr const_reference back() const; constexpr const_pointer data() const noexcept; // 7.7, basic_string_view modifiers constexpr void remove_prefix(size_type n); constexpr void remove_suffix(size_type n); constexpr void swap(basic_string_view& s) noexcept; size_type copy(charT* s, size_type n, size_type pos = 0) const; // constexpr in C++20 constexpr basic_string_view substr(size_type pos = 0, size_type n = npos) const; constexpr int compare(basic_string_view s) const noexcept; constexpr int compare(size_type pos1, size_type n1, basic_string_view s) const; constexpr int compare(size_type pos1, size_type n1, basic_string_view s, size_type pos2, size_type n2) const; constexpr int compare(const charT* s) const; constexpr int compare(size_type pos1, size_type n1, const charT* s) const; constexpr int compare(size_type pos1, size_type n1, const charT* s, size_type n2) const; constexpr size_type find(basic_string_view s, size_type pos = 0) const noexcept; constexpr size_type find(charT c, size_type pos = 0) const noexcept; constexpr size_type find(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension constexpr size_type find(const charT* s, size_type pos = 0) const noexcept; // noexcept as an extension constexpr size_type rfind(basic_string_view s, size_type pos = npos) const noexcept; constexpr size_type rfind(charT c, size_type pos = npos) const noexcept; constexpr size_type rfind(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension constexpr size_type rfind(const charT* s, size_type pos = npos) const noexcept; // noexcept as an extension constexpr size_type find_first_of(basic_string_view s, size_type pos = 0) const noexcept; constexpr size_type find_first_of(charT c, size_type pos = 0) const noexcept; constexpr size_type find_first_of(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension constexpr size_type find_first_of(const charT* s, size_type pos = 0) const noexcept; // noexcept as an extension constexpr size_type find_last_of(basic_string_view s, size_type pos = npos) const noexcept; constexpr size_type find_last_of(charT c, size_type pos = npos) const noexcept; constexpr size_type find_last_of(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension constexpr size_type find_last_of(const charT* s, size_type pos = npos) const noexcept; // noexcept as an extension constexpr size_type find_first_not_of(basic_string_view s, size_type pos = 0) const noexcept; constexpr size_type find_first_not_of(charT c, size_type pos = 0) const noexcept; constexpr size_type find_first_not_of(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension constexpr size_type find_first_not_of(const charT* s, size_type pos = 0) const noexcept; // noexcept as an extension constexpr size_type find_last_not_of(basic_string_view s, size_type pos = npos) const noexcept; constexpr size_type find_last_not_of(charT c, size_type pos = npos) const noexcept; constexpr size_type find_last_not_of(const charT* s, size_type pos, size_type n) const noexcept; // noexcept as an extension constexpr size_type find_last_not_of(const charT* s, size_type pos = npos) const noexcept; // noexcept as an extension constexpr bool starts_with(basic_string_view s) const noexcept; // C++20 constexpr bool starts_with(charT c) const noexcept; // C++20 constexpr bool starts_with(const charT* s) const; // C++20 constexpr bool ends_with(basic_string_view s) const noexcept; // C++20 constexpr bool ends_with(charT c) const noexcept; // C++20 constexpr bool ends_with(const charT* s) const; // C++20 constexpr bool contains(basic_string_view s) const noexcept; // C++23 constexpr bool contains(charT c) const noexcept; // C++23 constexpr bool contains(const charT* s) const; // C++23 private: const_pointer data_; // exposition only size_type size_; // exposition only }; // basic_string_view deduction guides template<class It, class End> basic_string_view(It, End) -> basic_string_view<iter_value_t<It>>; // C++20 template<class Range> basic_string_view(Range&&) -> basic_string_view<ranges::range_value_t<Range>>; // C++23 // 7.11, Hash support template <class T> struct hash; template <> struct hash<string_view>; template <> struct hash<u8string_view>; // C++20 template <> struct hash<u16string_view>; template <> struct hash<u32string_view>; template <> struct hash<wstring_view>; constexpr basic_string_view<char> operator""sv(const char *str, size_t len) noexcept; constexpr basic_string_view<wchar_t> operator""sv(const wchar_t *str, size_t len) noexcept; constexpr basic_string_view<char8_t> operator""sv(const char8_t *str, size_t len) noexcept; // C++20 constexpr basic_string_view<char16_t> operator""sv(const char16_t *str, size_t len) noexcept; constexpr basic_string_view<char32_t> operator""sv(const char32_t *str, size_t len) noexcept; } // namespace std */ // clang-format on #include <__algorithm/min.h> #include <__assert> #include <__config> #include <__functional/hash.h> #include <__functional/unary_function.h> #include <__fwd/ostream.h> #include <__fwd/string.h> #include <__fwd/string_view.h> #include <__iterator/bounded_iter.h> #include <__iterator/concepts.h> #include <__iterator/iterator_traits.h> #include <__iterator/reverse_iterator.h> #include <__iterator/wrap_iter.h> #include <__memory/pointer_traits.h> #include <__ranges/concepts.h> #include <__ranges/data.h> #include <__ranges/enable_borrowed_range.h> #include <__ranges/enable_view.h> #include <__ranges/size.h> #include <__string/char_traits.h> #include <__type_traits/is_array.h> #include <__type_traits/is_convertible.h> #include <__type_traits/is_same.h> #include <__type_traits/is_standard_layout.h> #include <__type_traits/is_trivial.h> #include <__type_traits/remove_cvref.h> #include <__type_traits/remove_reference.h> #include <__type_traits/type_identity.h> #include <cstddef> #include <iosfwd> #include <limits> #include <stdexcept> #include <version> // standard-mandated includes // [iterator.range] #include <__iterator/access.h> #include <__iterator/data.h> #include <__iterator/empty.h> #include <__iterator/reverse_access.h> #include <__iterator/size.h> // [string.view.synop] #include <compare> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) # pragma GCC system_header #endif _LIBCPP_PUSH_MACROS #include <__undef_macros> _LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_POP_MACROS #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 # include <algorithm> # include <concepts> # include <cstdlib> # include <iterator> # include <type_traits> #endif #endif // _LIBCPP_STRING_VIEW