1#ifndef MSTL_CORE_STRING_STRING_HPP__
2#define MSTL_CORE_STRING_STRING_HPP__
3#include "basic_string.hpp"
6using string = basic_string<char>;
7using bstring = basic_string<byte_t>;
8using wstring = basic_string<wchar_t>;
9#ifdef MSTL_STANDARD_20__
10using u8string = basic_string<char8_t>;
12using u16string = basic_string<char16_t>;
13using u32string = basic_string<char32_t>;
17MSTL_NODISCARD MSTL_CONSTEXPR20
string operator ""_s(
const char* str,
size_t len)
noexcept {
20MSTL_NODISCARD MSTL_CONSTEXPR20 wstring
operator ""_s(
const wchar_t* str,
size_t len)
noexcept {
23#ifdef MSTL_STANDARD_20__
24MSTL_NODISCARD MSTL_CONSTEXPR20 u8string
operator ""_s(
const char8_t* str,
size_t len)
noexcept {
28MSTL_NODISCARD MSTL_CONSTEXPR20 u16string
operator ""_s(
const char16_t* str,
size_t len)
noexcept {
31MSTL_NODISCARD MSTL_CONSTEXPR20 u32string
operator ""_s(
const char32_t* str,
size_t len)
noexcept {
37MSTL_CONSTEXPR20
string escape(
const string_view str) {
39 result.reserve(str.length() + str.length() / 4);
41 for (
const char c : str) {
80 if (
static_cast<byte_t>(c) < 0x20) {
82 constexpr char hex[] =
"0123456789abcdef";
84 result += hex[(c >> 4) & 0x0F];
85 result += hex[c & 0x0F];
96MSTL_CONSTEXPR20
string escape(
const string& str) {
97 return escape(str.view());
100MSTL_CONSTEXPR20
string escape(
const char* str) {
101 return escape(string_view{str});
105template <
typename CharT>
106MSTL_CONSTEXPR20
bool getline(
const basic_string_view<CharT>
data,
size_t& pos,
107 basic_string<CharT>& str, CharT delim =
static_cast<CharT
>(
'\n')) {
109 bool has_read =
false;
110 while (pos <
data.size()) {
112 const CharT c =
data[pos++];
113 if (c == delim)
break;
119template <
typename CharT>
120MSTL_CONSTEXPR20
bool getline(
const basic_string<CharT>
data,
size_t& pos,
121 basic_string<CharT>& str, CharT delim =
static_cast<CharT
>(
'\n')) {
123 bool has_read =
false;
124 while (pos <
data.size()) {
126 const CharT c =
data[pos++];
127 if (c == delim)
break;
133template <
typename CharT,
typename Pred>
134MSTL_CONSTEXPR20
bool getline(
const basic_string_view<CharT>
data,
size_t& pos,
135 basic_string<CharT>& str, Pred split = [](
const CharT c) {
136 return c ==
static_cast<CharT
>(
'\n');
139 bool has_read =
false;
140 while (pos <
data.size()) {
142 const CharT c =
data[pos++];
149template <
typename CharT,
typename Pred>
150MSTL_CONSTEXPR20
bool getline(
const basic_string<CharT>
data,
size_t& pos,
151 basic_string<CharT>& str, Pred split = [](
const CharT c) {
152 return c ==
static_cast<CharT
>(
'\n');
155 bool has_read =
false;
156 while (pos <
data.size()) {
158 const CharT c =
data[pos++];
167#ifdef MSTL_DATA_BUS_WIDTH_64__
168MSTL_INLINE17
constexpr uintptr_t ADDRESS_MASK = 0xF000000000000000ULL;
169MSTL_INLINE17
constexpr int ADDRESS_SHIFT = 60;
171MSTL_INLINE17
constexpr uintptr_t ADDRESS_MASK = 0xF0000000UL;
172MSTL_INLINE17
constexpr int ADDRESS_SHIFT = 28;
176MSTL_NODISCARD MSTL_CONSTEXPR20
string address_string(
const void* p) {
177 if (p ==
nullptr)
return {
"nullptr"};
180 constexpr size_t hex_digit_count =
sizeof(
void*) * 2;
181 constexpr char hex_digits[] =
"0123456789abcdef";
183 int shift =
_INNER ADDRESS_SHIFT;
186 result.reserve(2 + hex_digit_count);
188 for (
size_t i = 0; i < hex_digit_count; ++i) {
189 const byte_t digit =
static_cast<byte_t>((addr_val & mask) >> shift);
190 result += hex_digits[digit];
unsigned char byte_t
字节类型,定义为无符号字符
#define MSTL_END_LITERALS__
结束literals命名空间
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
#define MSTL_BEGIN_LITERALS__
开始literals命名空间(内联)
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针