Sane C++ Libraries
C++ Platform Abstraction Libraries
Loading...
Searching...
No Matches
StringViewData.h
1// Copyright (c) Stefano Cristiano
2// SPDX-License-Identifier: MIT
3#pragma once
4
5#include "../Foundation/LibC.h"
6#include "../Foundation/Span.h"
7
8namespace SC
9{
10#if SC_PLATFORM_WINDOWS
11#define SC_NATIVE_STR(str) L##str
12#else
13#define SC_NATIVE_STR(str) str
14#endif
15
17enum class StringEncoding : uint8_t
18{
19 Ascii = 0,
20 Utf8 = 1,
21 Utf16 = 2,
22#if SC_PLATFORM_WINDOWS
23 Native = Utf16,
24#else
25 Native = Utf8
26#endif
27};
28
31{
32 // clang-format off
33
35 constexpr StringViewData(StringEncoding encoding = StringEncoding::Ascii) : text(nullptr), textSizeInBytes(0), encoding(static_cast<uint8_t>(encoding)), hasNullTerm(0) {}
36
41 constexpr StringViewData(Span<const char> text, bool nullTerm, StringEncoding encoding) : text(text.data()), textSizeInBytes(text.sizeInBytes()), encoding(static_cast<uint8_t>(encoding)), hasNullTerm(nullTerm ? 1 : 0) {}
42
44 template <size_t N>
45 constexpr StringViewData(const char (&str)[N]) : text(str), textSizeInBytes(N - 1), encoding(static_cast<uint8_t>(StringEncoding::Ascii)), hasNullTerm(true) {}
46
48 static constexpr StringViewData fromNullTerminated(const char* text, StringEncoding encoding) { return text == nullptr ? StringViewData(encoding) : StringViewData({text, ::strlen(text)}, true, encoding); }
49
50#if SC_PLATFORM_WINDOWS
51 constexpr StringViewData(Span<const wchar_t> textSpan, bool nullTerm) : textWide(textSpan.data()), textSizeInBytes(textSpan.sizeInBytes()), encoding(static_cast<uint8_t>(StringEncoding::Native)), hasNullTerm(nullTerm ? 1 : 0) {}
52
53 template <size_t N>
54 constexpr StringViewData(const wchar_t (&str)[N]) : textWide(str), textSizeInBytes((N - 1)* sizeof(wchar_t)), encoding(static_cast<uint8_t>(StringEncoding::Native)), hasNullTerm(true) {}
55 static constexpr StringViewData fromNullTerminated(const wchar_t* text, StringEncoding encoding) { return text == nullptr ? StringViewData(encoding) : StringViewData({text, ::wcslen(text)}, true); }
56#endif
57
58 // clang-format on
59
61 [[nodiscard]] Span<const char> toCharSpan() const { return {text, textSizeInBytes}; }
62
64 [[nodiscard]] constexpr bool isEmpty() const { return text == nullptr or textSizeInBytes == 0; }
65
67 [[nodiscard]] constexpr bool isNullTerminated() const { return hasNullTerm; }
68
70 [[nodiscard]] constexpr size_t sizeInBytes() const { return textSizeInBytes; }
71
73 [[nodiscard]] constexpr StringEncoding getEncoding() const { return static_cast<StringEncoding>(encoding); }
74
76 [[nodiscard]] constexpr const char* bytesWithoutTerminator() const { return text; }
77
82 [[nodiscard]] auto getNullTerminatedNative() const
83 {
84#if SC_PLATFORM_WINDOWS
85 return textWide;
86#else
87 return text;
88#endif
89 }
90
91 protected:
92 union
93 {
94 const char* text;
95#if SC_PLATFORM_WINDOWS
96 const wchar_t* textWide;
97#endif
98 };
99
100 static constexpr size_t NumOptionBits = 3;
101 static constexpr size_t MaxLength = (~static_cast<size_t>(0)) >> NumOptionBits;
102
103 size_t textSizeInBytes : sizeof(size_t) * 8 - NumOptionBits;
104 size_t encoding : 2;
105 size_t hasNullTerm : 1;
106};
107} // namespace SC
#define SC_COMPILER_EXPORT
Macro for symbol visibility in non-MSVC compilers.
Definition Compiler.h:78
unsigned char uint8_t
Platform independent (1) byte unsigned int.
Definition PrimitiveTypes.h:36
View over a contiguous sequence of items (pointer + size in elements).
Definition Span.h:29
An read-only view over a string (to avoid including Strings library)
Definition StringViewData.h:31
constexpr const char * bytesWithoutTerminator() const
Directly access the memory of this StringView.
Definition StringViewData.h:76
constexpr bool isEmpty() const
Return true if StringView is empty.
Definition StringViewData.h:64
constexpr bool isNullTerminated() const
Check if StringView is immediately followed by a null termination character.
Definition StringViewData.h:67
constexpr StringViewData(StringEncoding encoding=StringEncoding::Ascii)
Construct an empty StringView.
Definition StringViewData.h:35
auto getNullTerminatedNative() const
Directly access the memory of this null terminated-StringView.
Definition StringViewData.h:82
Span< const char > toCharSpan() const
Obtain a const char Span from this StringView.
Definition StringViewData.h:61
static constexpr StringViewData fromNullTerminated(const char *text, StringEncoding encoding)
Constructs a StringView from a null terminated string.
Definition StringViewData.h:48
constexpr StringViewData(Span< const char > text, bool nullTerm, StringEncoding encoding)
Construct a StringView from a Span of bytes.
Definition StringViewData.h:41
constexpr StringEncoding getEncoding() const
Get encoding of this StringView.
Definition StringViewData.h:73
constexpr size_t sizeInBytes() const
Get size of the StringView in bytes.
Definition StringViewData.h:70
constexpr StringViewData(const char(&str)[N])
Constructs a StringView with a null terminated string terminal.
Definition StringViewData.h:45