172 lines · plain
1#ifndef _STRING_2#define _STRING_3 4// For size_t5#include <string.h>6 7typedef unsigned __INT16_TYPE__ char16;8typedef unsigned __INT32_TYPE__ char32;9 10namespace std {11template <typename T>12class allocator {};13 14template <typename T>15class char_traits {};16 17template <typename C, typename T = char_traits<C>>18struct basic_string_view;19 20template <typename C, typename T = char_traits<C>, typename A = allocator<C>>21struct basic_string {22 typedef size_t size_type;23 typedef basic_string<C, T, A> _Type;24 basic_string();25 basic_string(const C *p, const A &a = A());26 basic_string(const C *p, size_type count);27 basic_string(const C *b, const C *e);28 29 ~basic_string();30 31 const C *c_str() const;32 const C *data() const;33 34 bool empty() const;35 size_type size() const;36 size_type length() const;37 38 _Type& append(const C *s);39 _Type& append(const C *s, size_type n);40 _Type& assign(const C *s);41 _Type& assign(const C *s, size_type n);42 43 int compare(const _Type&) const;44 int compare(const C* s) const;45 int compare(size_type pos, size_type len, const _Type&) const;46 int compare(size_type pos, size_type len, const C* s) const;47 template<class StringViewLike>48 int compare(size_type pos1, size_type count1, const StringViewLike& t) const;49 50 size_type find(const _Type& str, size_type pos = 0) const;51 size_type find(const C* s, size_type pos = 0) const;52 size_type find(const C* s, size_type pos, size_type n) const;53 size_type find(C ch, size_type pos = 0) const;54 template<class StringViewLike>55 size_type find(const StringViewLike& t, size_type pos = 0) const;56 57 size_type rfind(const _Type& str, size_type pos = npos) const;58 size_type rfind(const C* s, size_type pos, size_type count) const;59 size_type rfind(const C* s, size_type pos = npos) const;60 size_type rfind(C ch, size_type pos = npos) const;61 62 constexpr bool contains(std::basic_string_view<C, T> sv) const noexcept;63 constexpr bool contains(C ch) const noexcept;64 constexpr bool contains(const C* s) const;65 66 _Type& insert(size_type pos, const _Type& str);67 _Type& insert(size_type pos, const C* s);68 _Type& insert(size_type pos, const C* s, size_type n);69 70 _Type substr(size_type pos = 0, size_type count = npos) const;71 72 constexpr bool starts_with(std::basic_string_view<C, T> sv) const noexcept;73 constexpr bool starts_with(C ch) const noexcept;74 constexpr bool starts_with(const C* s) const;75 76 constexpr bool ends_with(std::basic_string_view<C, T> sv) const noexcept;77 constexpr bool ends_with(C ch) const noexcept;78 constexpr bool ends_with(const C* s) const;79 80 _Type& operator[](size_type);81 const _Type& operator[](size_type) const;82 83 _Type& operator+=(const _Type& str);84 _Type& operator+=(const C* s);85 _Type& operator=(const _Type& str);86 _Type& operator=(const C* s);87 88 static constexpr size_t npos = -1;89};90 91typedef basic_string<char> string;92typedef basic_string<wchar_t> wstring;93typedef basic_string<char16> u16string;94typedef basic_string<char32> u32string;95 96template <typename C, typename T>97struct basic_string_view {98 typedef size_t size_type;99 typedef basic_string_view<C, T> _Type;100 101 const C *str;102 constexpr basic_string_view(const C* s) : str(s) {}103 104 const C *data() const;105 106 bool empty() const;107 size_type size() const;108 size_type length() const;109 110 size_type find(_Type v, size_type pos = 0) const;111 size_type find(C ch, size_type pos = 0) const;112 size_type find(const C* s, size_type pos, size_type count) const;113 size_type find(const C* s, size_type pos = 0) const;114 115 size_type rfind(_Type v, size_type pos = npos) const;116 size_type rfind(C ch, size_type pos = npos) const;117 size_type rfind(const C* s, size_type pos, size_type count) const;118 size_type rfind(const C* s, size_type pos = npos) const;119 120 constexpr bool contains(basic_string_view sv) const noexcept;121 constexpr bool contains(C ch) const noexcept;122 constexpr bool contains(const C* s) const;123 124 constexpr bool starts_with(basic_string_view sv) const noexcept;125 constexpr bool starts_with(C ch) const noexcept;126 constexpr bool starts_with(const C* s) const;127 128 constexpr bool ends_with(basic_string_view sv) const noexcept;129 constexpr bool ends_with(C ch) const noexcept;130 constexpr bool ends_with(const C* s) const;131 132 constexpr int compare(basic_string_view sv) const noexcept;133 134 static constexpr size_t npos = -1;135};136 137typedef basic_string_view<char> string_view;138typedef basic_string_view<wchar_t> wstring_view;139typedef basic_string_view<char16> u16string_view;140typedef basic_string_view<char32> u32string_view;141 142std::string operator+(const std::string&, const std::string&);143std::string operator+(const std::string&, const char*);144std::string operator+(const char*, const std::string&);145 146bool operator==(const std::string&, const std::string&);147bool operator==(const std::string&, const char*);148bool operator==(const char*, const std::string&);149 150bool operator==(const std::wstring&, const std::wstring&);151bool operator==(const std::wstring&, const wchar_t*);152bool operator==(const wchar_t*, const std::wstring&);153 154bool operator==(const std::string_view&, const std::string_view&);155bool operator==(const std::string_view&, const char*);156bool operator==(const char*, const std::string_view&);157 158#if __cplusplus < 202002L159bool operator!=(const std::string&, const std::string&);160bool operator!=(const std::string&, const char*);161bool operator!=(const char*, const std::string&);162 163bool operator!=(const std::string_view&, const std::string_view&);164bool operator!=(const std::string_view&, const char*);165bool operator!=(const char*, const std::string_view&);166#endif167 168size_t strlen(const char* str);169}170 171#endif // _STRING_172