1#ifndef NEFORCE_CORE_STRING_STRING_HPP__
2#define NEFORCE_CORE_STRING_STRING_HPP__
13NEFORCE_BEGIN_NAMESPACE__
27#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
40NEFORCE_BEGIN_LITERALS__
54NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
string operator""_s(
const char* str,
size_t len)
noexcept {
return {str, len}; }
62NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
wstring operator""_s(
const wchar_t* str,
size_t len)
noexcept {
66#if defined(NEFORCE_STANDARD_20) || defined(NEXUSFORCE_ENABLE_DOXYGEN)
73NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
u8string operator""_s(
const char8_t* str,
size_t len)
noexcept {
84NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
u16string operator""_s(
const char16_t* str,
size_t len)
noexcept {
94NEFORCE_NODISCARD NEFORCE_CONSTEXPR20
u32string operator""_s(
const char32_t* str,
size_t len)
noexcept {
100NEFORCE_END_LITERALS__
120 for (
const char c: str) {
159 if (
static_cast<byte_t>(c) < 0x20) {
161 constexpr char hex[] =
"0123456789abcdef";
163 result += hex[(c >> 4) & 0x0F];
164 result += hex[c & 0x0F];
202template <
typename CharT>
204 CharT delim =
static_cast<CharT
>(
'\n')) {
206 bool has_read =
false;
208 while (pos <
data.size()) {
210 const CharT c =
data[pos++];
228template <
typename CharT>
230 CharT delim =
static_cast<CharT
>(
'\n')) {
232 bool has_read =
false;
234 while (pos <
data.size()) {
236 const CharT c =
data[pos++];
257template <
typename CharT,
typename Pred>
260 Pred split = [](
const CharT c) {
return c ==
static_cast<CharT
>(
'\n'); }) {
262 bool has_read =
false;
264 while (pos <
data.size()) {
266 const CharT c =
data[pos++];
285template <
typename CharT,
typename Pred>
288 Pred split = [](
const CharT c) {
return c ==
static_cast<CharT
>(
'\n'); }) {
290 bool has_read =
false;
292 while (pos <
data.size()) {
294 const CharT c =
data[pos++];
317#ifdef NEFORCE_ARCH_BITS_64
318 constexpr uintptr_t address_mask = 0xF000000000000000ULL;
319 constexpr int address_shift = 60;
321 constexpr uintptr_t address_mask = 0xF0000000UL;
322 constexpr int address_shift = 28;
324 constexpr char hex_digits[] =
"0123456789abcdef";
325 constexpr size_t hex_digit_count =
sizeof(
void*) * 2;
329 int shift = address_shift;
332 result.
reserve(2 + hex_digit_count);
334 for (
size_t i = 0; i < hex_digit_count; ++i) {
335 const byte_t digit =
static_cast<byte_t>((addr_val & mask) >> shift);
336 result += hex_digits[digit];
345NEFORCE_END_NAMESPACE__
NEFORCE_NODISCARD constexpr size_type length() const noexcept
获取字符串长度
NEFORCE_CONSTEXPR20 void reserve(const size_type n)
预留容量
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 view_type view() const noexcept
获取字符串视图
NEFORCE_CONSTEXPR20 void push_back(value_type value)
在末尾插入字符
NEFORCE_CONSTEXPR20 void clear() noexcept
清空字符串
unsigned char byte_t
字节类型,定义为无符号字符
NEFORCE_NODISCARD NEFORCE_CONSTEXPR20 string address_string(const void *p)
将指针转换为十六进制地址字符串
basic_string< char16_t > u16string
UTF-16字符串
basic_string< char > string
字符字符串
NEFORCE_CONSTEXPR20 bool getline(const basic_string_view< CharT > data, size_t &pos, basic_string< CharT > &str, CharT delim=static_cast< CharT >('\n'))
从字符串视图中按分隔符读取一行(字符版本)
basic_string< char8_t > u8string
UTF-8字符串
basic_string< wchar_t > wstring
宽字符字符串
NEFORCE_CONSTEXPR20 string escape(const string_view str)
转义字符串视图中的特殊字符
basic_string< char32_t > u32string
UTF-32字符串
basic_string_view< char > string_view
字符字符串视图
NEFORCE_NODISCARD NEFORCE_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针