4#include "../Foundation/Result.h"
5#include "../Foundation/Span.h"
10#define SC_NATIVE_STR(str) L##str
12#define SC_NATIVE_STR(str) str
16enum class StringEncoding :
uint8_t
21#if SC_PLATFORM_WINDOWS
31constexpr uint32_t StringEncodingGetSize(StringEncoding encoding) {
return encoding == StringEncoding::Utf16 ? 2 : 1; }
41 constexpr StringSpan(StringEncoding encoding = StringEncoding::Ascii) : text(nullptr), textSizeInBytes(0), encoding(static_cast<
uint8_t>(encoding)), hasNullTerm(0) {}
47 constexpr StringSpan(
Span<const char> text,
bool nullTerm, StringEncoding encoding) : text(text.data()), textSizeInBytes(text.sizeInBytes()), encoding(static_cast<
uint8_t>(encoding)), hasNullTerm(nullTerm ? 1 : 0) {}
51 constexpr StringSpan(
const char (&str)[N]) : text(str), textSizeInBytes(N - 1), encoding(static_cast<
uint8_t>(StringEncoding::Ascii)), hasNullTerm(true) {}
56#if SC_PLATFORM_WINDOWS
57 constexpr StringSpan(
Span<const wchar_t> textSpan,
bool nullTerm, StringEncoding encoding = StringEncoding::Native) : textWide(textSpan.data()), textSizeInBytes(textSpan.sizeInBytes()), encoding(static_cast<
uint8_t>(encoding)), hasNullTerm(nullTerm ? 1 : 0) {}
60 constexpr StringSpan(
const wchar_t (&str)[N]) : textWide(str), textSizeInBytes((N - 1)* sizeof(wchar_t)), encoding(static_cast<uint8_t>(StringEncoding::Native)), hasNullTerm(true) {}
61 static constexpr StringSpan fromNullTerminated(
const wchar_t* text, StringEncoding encoding) {
return text ==
nullptr ? StringSpan(encoding) : StringSpan({text, ::wcslen(text)},
true); }
63 constexpr bool operator ==(
const StringSpan other)
const {
return textSizeInBytes == other.textSizeInBytes and ::memcmp(text, other.text, textSizeInBytes) == 0; }
70 [[nodiscard]]
constexpr bool isEmpty()
const {
return text ==
nullptr or textSizeInBytes == 0; }
76 [[nodiscard]]
constexpr size_t sizeInBytes()
const {
return textSizeInBytes; }
83 [[nodiscard]]
constexpr StringEncoding
getEncoding()
const {
return static_cast<StringEncoding
>(encoding); }
95#if SC_PLATFORM_WINDOWS
96 [[nodiscard]]
const wchar_t* getNullTerminatedNative()
const {
return textWide; }
106 StringSpan view()
const {
return {{writableSpan.data(), length},
true, StringEncoding::Native}; }
123#if SC_PLATFORM_WINDOWS
124 const wchar_t* textWide;
128 static constexpr size_t NumOptionBits = 3;
129 static constexpr size_t MaxLength = (~static_cast<size_t>(0)) >> NumOptionBits;
131 size_t textSizeInBytes :
sizeof(
size_t) * 8 - NumOptionBits;
133 size_t hasNullTerm : 1;
unsigned char uint8_t
Platform independent (1) byte unsigned int.
Definition PrimitiveTypes.h:36
unsigned long size_t
Platform independent unsigned size type.
Definition PrimitiveTypes.h:56
unsigned int uint32_t
Platform independent (4) bytes unsigned int.
Definition PrimitiveTypes.h:38
An ascii string used as boolean result. SC_TRY macro forwards errors to caller.
Definition Result.h:12
View over a contiguous sequence of items (pointer + size in elements).
Definition Span.h:29
Definition StringSpan.h:102
An read-only view over a string (to avoid including Strings library when parsing is not needed).
Definition StringSpan.h:37
constexpr StringSpan(const char(&str)[N])
Constructs a StringView with a null terminated string terminal.
Definition StringSpan.h:51
constexpr size_t sizeInBytes() const
Get size of the StringView in bytes.
Definition StringSpan.h:76
static constexpr StringSpan fromNullTerminated(const char *text, StringEncoding encoding)
Constructs a StringView from a null terminated string.
Definition StringSpan.h:54
Span< const char > toCharSpan() const
Obtain a const char Span from this StringView.
Definition StringSpan.h:67
const char * getNullTerminatedNative() const
Directly access the memory of this null terminated-StringView:
Definition StringSpan.h:98
const char * bytesIncludingTerminator() const
Directly access the memory of this null terminated-StringView.
constexpr StringEncoding getEncoding() const
Get encoding of this StringView.
Definition StringSpan.h:83
constexpr bool isEmpty() const
Return true if StringView is empty.
Definition StringSpan.h:70
constexpr StringSpan(Span< const char > text, bool nullTerm, StringEncoding encoding)
Construct a StringView from a Span of bytes.
Definition StringSpan.h:47
constexpr StringSpan(StringEncoding encoding=StringEncoding::Ascii)
Construct an empty StringView.
Definition StringSpan.h:41
constexpr bool isNullTerminated() const
Check if StringView is immediately followed by a null termination character.
Definition StringSpan.h:73
constexpr const char * bytesWithoutTerminator() const
Directly access the memory of this StringView.
Definition StringSpan.h:86
size_t sizeInBytesIncludingTerminator() const
Get size of the StringView in bytes, including null terminator (2 bytes on UTF16)
Result writeNullTerminatedTo(NativeWritable &string) const
Writes this Span to a destination Span, using native encoding and null-terminating it.
Result appendNullTerminatedTo(NativeWritable &string, bool removePreviousNullTerminator=true) const
Appends this Span to a destination Span, using native encoding and null-terminating it.
Non-owning view over a range of characters with UTF Encoding.
Definition StringView.h:46