Sane C++ Libraries: String.h Source File (original) (raw)
1
2
3#pragma once
4#include "../Foundation/StringSpan.h"
5#include "../Memory/Buffer.h"
6
7namespace SC
8{
9template
10struct SmallString;
11namespace Reflection
12{
13template
14struct Reflect;
15}
16
19
26struct SC_COMPILER_EXPORT String
27{
30 String(StringEncoding encoding = StringEncoding::Utf8) : encoding(encoding) {}
31
36
40
45 template <size_t N>
50
55
61
64 [[nodiscard]] StringEncoding getEncoding() const { return encoding; }
65
69
73
76 [[nodiscard]] bool isEmpty() const { return data.isEmpty(); }
77
80 [[nodiscard]] StringSpan view() const SC_LANGUAGE_LIFETIME_BOUND;
81
85 [[nodiscard]] bool operator==(const String& other) const { return view() == (other.view()); }
86
90 [[nodiscard]] bool operator!=(const String& other) const { return not operator==(other); }
91
95 [[nodiscard]] bool operator==(const StringSpan other) const { return view() == (other); }
96
100 [[nodiscard]] bool operator!=(const StringSpan other) const { return not operator==(other); }
101
106 template <size_t N>
107 [[nodiscard]] bool operator==(const char (&other)[N]) const
108 {
109 return view() == other;
110 }
115 template <size_t N>
116 [[nodiscard]] bool operator!=(const char (&other)[N]) const
117 {
118 return view() != other;
119 }
120
124 [[nodiscard]] bool operator<(const StringSpan other) const { return view() < other; }
125
131 template <size_t N>
133 {
135 return *this;
136 }
137
141
142 protected:
143 struct Internal;
144
145 friend struct StringTest;
146 template
147 friend struct Reflection::Reflect;
148
149 template
150 friend struct GrowableBuffer;
152 {
154
155 IGrowableBuffer::DirectAccess& da;
156
159 void finalize() noexcept;
160 bool tryGrowTo(size_t newSize) noexcept;
161 };
162
163 StringEncoding encoding;
165
166 String(StringEncoding encoding, uint32_t inlineCapacity);
167 String(Buffer&& otherData, StringEncoding encoding, uint32_t inlineCapacity);
168};
169
172template
174{
175
176 SmallString(StringEncoding encoding = StringEncoding::Utf8) : String(encoding, N) {}
179 String& operator=(const SmallString& other) { return String::operator=(other); }
180 String& operator=(SmallString&& other) { return String::operator=(move(other)); }
181
186 template <size_t Q>
188 {}
189
190 private:
192 char buffer[N];
193};
195
196template
198
199
200template <>
201struct SC_COMPILER_EXPORT GrowableBuffer<String> : public IGrowableBuffer
202{
204 GrowableBuffer(String& string)
205 : IGrowableBuffer(&GrowableBuffer::tryGrowTo), gi(string, IGrowableBuffer::directAccess)
206 {}
207 static bool tryGrowTo(IGrowableBuffer& gb, size_t newSize) noexcept
208 {
209 return static_cast<GrowableBuffer&>(gb).gi.tryGrowTo(newSize);
210 }
211 static auto getEncodingFor(const String& str) noexcept { return str.getEncoding(); }
212 void finalize() noexcept { gi.finalize(); }
213};
214
215template
216struct SC_COMPILER_EXPORT GrowableBuffer<SmallString> : public IGrowableBuffer
217{
219 GrowableBuffer(String& string)
220 : IGrowableBuffer(&GrowableBuffer::tryGrowTo), gi(string, IGrowableBuffer::directAccess)
221 {}
222 static bool tryGrowTo(IGrowableBuffer& gb, size_t newSize) noexcept
223 {
224 return static_cast<GrowableBuffer&>(gb).gi.tryGrowTo(newSize);
225 }
227 void finalize() noexcept { gi.finalize(); }
228};
229}
#define SC_ASSERT_RELEASE(e)
Assert expression e to be true.
Definition Assert.h:46
constexpr T && move(T &value)
Converts an lvalue to an rvalue reference.
Definition Compiler.h:264
unsigned long long uint64_t
Platform independent (8) bytes unsigned int.
Definition PrimitiveTypes.h:42
unsigned int uint32_t
Platform independent (4) bytes unsigned int.
Definition PrimitiveTypes.h:38
char native_char_t
The native char for the platform (wchar_t (4 bytes) on Windows, char (1 byte) everywhere else )
Definition PrimitiveTypes.h:34
An heap allocated byte buffer that can optionally use an inline buffer.
Definition Buffer.h:29
String with compile time configurable inline storage (small string optimization)
Definition String.h:174
An read-only view over a string (to avoid including Strings library when parsing is not needed).
Definition StringSpan.h:37
A non-modifiable owning string with associated encoding.
Definition String.h:27
StringEncoding getEncoding() const
Get StringSpan encoding.
Definition String.h:64
bool operator!=(const String &other) const
Check if current String is different from other String.
Definition String.h:90
bool operator<(const StringSpan other) const
Check if current String is smaller to another StringView (using StringView::compare)
Definition String.h:124
bool operator!=(const char(&other)[N]) const
Check if current String is different from the ascii string literal.
Definition String.h:116
StringSpan view() const SC_LANGUAGE_LIFETIME_BOUND
Obtain a null-terminated StringSpan from current String.
String(const char(&text)[N])
Builds String with a null terminated char string literal.
Definition String.h:46
bool owns(StringSpan view) const
Checks if the memory pointed by the StringSpan is owned by this String.
size_t sizeInBytesIncludingTerminator() const
Get length of the string in bytes (including null terminator bytes)
Definition String.h:68
String(StringEncoding encoding=StringEncoding::Utf8)
Builds an empty String with a given Encoding.
Definition String.h:30
bool operator!=(const StringSpan other) const
Check if current String is different from other StringSpan.
Definition String.h:100
String & operator=(const char(&text)[N])
Assigns an ascii string literal to current String.
Definition String.h:132
bool assign(StringSpan sv)
Assigns a StringSpan to this String, replacing existing contents.
bool operator==(const StringSpan other) const
Check if current String is same as other StringSpan.
Definition String.h:95
String & operator=(StringSpan view)
Assigns (copy) contents of given StringSpan in current String.
bool isEmpty() const
Check if String is empty.
Definition String.h:76
const char * bytesIncludingTerminator() const
Access current string content as read-only null-terminated const char*
Definition String.h:72
String(Buffer &&otherData, StringEncoding encoding)
Builds a String from a buffer ensuring zero termination.
String(StringSpan sv)
Builds String from a StringSpan.
Definition String.h:35
bool operator==(const char(&other)[N]) const
Check if current String is equal to the ascii string literal.
Definition String.h:107