SDL3pp
A slim C++ wrapper for SDL3
Loading...
Searching...
No Matches
SDL3pp_strings.h
1#ifndef SDL3PP_STRINGS_H_
2#define SDL3PP_STRINGS_H_
3
4#include <span>
5#include <string>
6#include <string_view>
7#include <variant>
8#include <SDL3/SDL_assert.h>
9#include <SDL3/SDL_stdinc.h>
10#include "SDL3pp_ownPtr.h"
11
12namespace SDL {
13
21
22#ifndef SDL3PP_ENABLE_STRING_PARAM
23
24#ifndef SDL3PP_DISABLE_STRING_PARAM
25
29#define SDL3PP_ENABLE_STRING_PARAM
30#endif // SDL3PP_DISABLE_STRING_PARAM
31
32#endif // SDL3PP_ENABLE_STRING_PARAM
33
34#ifdef SDL3PP_ENABLE_STRING_PARAM
35
36#ifndef SDL3PP_DISABLE_STRING_PARAM_STRING_VIEW_BUFFERING
37
38#ifndef SDL3PP_STRING_PARAM_STRING_VIEW_BUFFERING_COUNT
39
41#define SDL3PP_STRING_PARAM_STRING_VIEW_BUFFERING_COUNT 32
42#endif // SDL3PP_STRING_PARAM_STRING_VIEW_BUFFERING_COUNT
43
44#endif // SDL3PP_DISABLE_STRING_PARAM_STRING_VIEW_BUFFERING
45
58{
59public:
69 constexpr StringParam(const char* str = "")
70 : m_data(str)
71 {
72 }
73
84 StringParam(const std::string& str)
85 : StringParam(str.c_str())
86 {
87 }
88
98 StringParam(std::string_view str)
99 : m_data(wrapStringView(str))
100 {
101 }
102
109 constexpr const char* c_str() const { return m_data; }
110
117 constexpr operator const char*() const { return m_data; }
118
119private:
120 const char* m_data;
121
122 static const char* wrapStringView(std::string_view str)
123 {
124 if (str.empty()) return "";
125
126#ifdef SDL3PP_DISABLE_STRING_PARAM_STRING_VIEW_BUFFERING
127 SDL_assert(str.data()[str.size()] == 0);
128 return str.data();
129
130#else
131 if (str.data()[str.size()] == 0) return str.data();
132
133 constexpr size_t bufferCount =
135 static thread_local std::string buffer[bufferCount];
136 static thread_local size_t bufferIndex = 0;
137 buffer[bufferIndex] = str;
138 auto cstr = buffer[bufferIndex].c_str();
139 bufferIndex = (bufferIndex + 1) % bufferCount;
140 return cstr;
141
142#endif // SDL3PP_DISABLE_STRING_PARAM_STRING_VIEW_BUFFERING
143 }
144};
145
146#else // SDL3PP_ENABLE_STRING_PARAM
147
148using StringParam = const char*;
149
150#endif // SDL3PP_ENABLE_STRING_PARAM
151
155struct StringResult : OwnArray<char>
156{
158 using OwnArray::OwnArray;
159
162 : StringResult(std::string_view(other))
163 {
164 }
165
167 constexpr StringResult(StringResult&& other) noexcept
168 : OwnArray(other.release(), other.size())
169 {
170 }
171
173 StringResult(std::string_view other)
174 : OwnArray(other.empty() ? nullptr
175 : SDL_strndup(other.data(), other.size()))
176 {
177 }
178
181
183 operator StringParam() const { return std::string_view{*this}; }
184
186 constexpr operator std::string_view() const
187 {
188 return std::string_view{data(), size()};
189 }
190
192 StringResult& operator+=(std::string_view other)
193 {
194 if (empty()) {
195 reset(StringResult(other).release());
196 } else if (!other.empty()) {
197 size_t lhsSz = size();
198 size_t rhsSz = other.size();
199 size_t finalSize = lhsSz + lhsSz + 1;
200 auto newBuf = static_cast<char*>(SDL_realloc(data(), finalSize));
201 newBuf += lhsSz;
202 SDL_memcpy(newBuf, other.data(), rhsSz);
203 newBuf += rhsSz;
204 *newBuf = 0;
205 reset(newBuf, finalSize - 1);
206 }
207 return *this;
208 }
209
212 {
213 return (*this) += std::string_view{&ch, 1};
214 }
215
217 friend inline StringResult operator+(StringResult lhs, std::string_view rhs)
218 {
219 lhs += rhs;
220 return lhs;
221 }
222
224 friend inline StringResult operator+(const StringResult& lhs, char rhs)
225 {
226 return lhs + std::string_view{&rhs, 1};
227 }
228
230 std::string str() const { return std::string{data(), size()}; }
231
233 const char* c_str() const
234 {
235 if (empty()) return "";
236 return data();
237 }
238};
239
246{
247 const void* m_data;
248 size_t m_size_bytes;
249
250public:
252 constexpr SourceBytes() = default;
253
255 constexpr SourceBytes(std::nullptr_t)
256 : SourceBytes()
257 {
258 }
259
266 template<class T, size_t N>
267 constexpr SourceBytes(std::span<T, N> span)
268 : SourceBytes(span.data(), span.size_bytes())
269 {
270 }
271
277 template<class T>
278 constexpr SourceBytes(const T& data)
279 : SourceBytes(std::span{data.data(), data.size()})
280 {
281 }
282
287 template<class T, size_t N>
288 constexpr SourceBytes(T (&data)[N])
289 : SourceBytes(std::span<T, N>{static_cast<T*>(data), N})
290 {
291 }
292
300 constexpr SourceBytes(const void* data, size_t size_bytes)
301 : m_data(size_bytes > 0 ? data : nullptr)
302 , m_size_bytes(data != nullptr ? size_bytes : 0)
303 {
304 }
305
307 constexpr size_t size() const { return m_size_bytes; }
308
310 constexpr size_t size_bytes() const { return m_size_bytes; }
311
313 constexpr const char* data() const
314 {
315 return static_cast<const char*>(m_data);
316 }
317
319 template<class T>
320 constexpr const T* data_as() const
321 {
322 return static_cast<const T*>(m_data);
323 }
324};
325
332{
333 void* m_data = nullptr;
334 size_t m_size_bytes = 0;
335
336public:
338 constexpr TargetBytes() = default;
339
341 constexpr TargetBytes(std::nullptr_t)
342 : TargetBytes()
343 {
344 }
345
347 constexpr TargetBytes(const TargetBytes& other) = default;
348
350 constexpr TargetBytes(TargetBytes&& other) = default;
351
353 constexpr TargetBytes& operator=(const TargetBytes& other) = default;
354
356 constexpr TargetBytes& operator=(TargetBytes&& other) = default;
357
359 template<class T, size_t N>
360 constexpr TargetBytes(std::span<const T, N>)
361 {
362 static_assert(false, "Non-const type is required");
363 }
364
371 template<class T, size_t N>
372 constexpr TargetBytes(std::span<T, N> span)
373 : TargetBytes(span.data(), span.size_bytes())
374 {
375 }
376
382 template<class T>
383 constexpr TargetBytes(T& data)
384 : TargetBytes(std::span{data.data(), data.size()})
385 {
386 }
387
392 template<class T, size_t N>
393 constexpr TargetBytes(T (&data)[N])
394 : TargetBytes(std::span<T, N>{static_cast<T*>(data), N})
395 {
396 }
397
405 constexpr TargetBytes(void* data, size_t size_bytes)
406 : m_data(size_bytes > 0 ? data : nullptr)
407 , m_size_bytes(data != nullptr ? size_bytes : 0)
408 {
409 }
410
412 constexpr size_t size() const { return m_size_bytes; }
413
415 constexpr size_t size_bytes() const { return m_size_bytes; }
416
418 constexpr char* data() const { return static_cast<char*>(m_data); }
419
421 template<class T>
422 constexpr T* data_as() const
423 {
424 return static_cast<T*>(m_data);
425 }
426};
427
429
430} // namespace SDL
431
432#endif /* SDL3PP_STRINGS_H_ */
char * release()
Definition SDL3pp_ownPtr.h:91
void reset(char *newValue=nullptr)
Definition SDL3pp_ownPtr.h:99
constexpr bool empty() const
Definition SDL3pp_ownPtr.h:74
constexpr char * data()
Definition SDL3pp_ownPtr.h:77
constexpr size_t size() const
Definition SDL3pp_ownPtr.h:83
constexpr OwnArray(std::nullptr_t=nullptr)
Constructor.
Definition SDL3pp_ownPtr.h:50
constexpr SourceBytes(std::span< T, N > span)
From span.
Definition SDL3pp_strings.h:267
constexpr SourceBytes(const T &data)
From container-like.
Definition SDL3pp_strings.h:278
constexpr size_t size_bytes() const
Retrieves contained size in bytes.
Definition SDL3pp_strings.h:310
constexpr SourceBytes(std::nullptr_t)
Disambiguate between multiple pointer types.
Definition SDL3pp_strings.h:255
constexpr SourceBytes(const void *data, size_t size_bytes)
From data + size in bytes.
Definition SDL3pp_strings.h:300
constexpr size_t size() const
Retrieves contained size.
Definition SDL3pp_strings.h:307
constexpr SourceBytes()=default
Default ctor.
constexpr SourceBytes(T(&data)[N])
From array.
Definition SDL3pp_strings.h:288
constexpr const char * data() const
Retrieves contained data.
Definition SDL3pp_strings.h:313
constexpr const T * data_as() const
Retrieves contained data.
Definition SDL3pp_strings.h:320
Helpers to use C++ strings parameters.
Definition SDL3pp_strings.h:58
constexpr const char * c_str() const
Converts to a null terminated C string.
Definition SDL3pp_strings.h:109
constexpr StringParam(const char *str="")
Constructs from a C string.
Definition SDL3pp_strings.h:69
StringParam(std::string_view str)
Constructs from std::string_view object.
Definition SDL3pp_strings.h:98
StringParam(const std::string &str)
Constructs from std::string reference.
Definition SDL3pp_strings.h:84
constexpr TargetBytes & operator=(TargetBytes &&other)=default
Move assignment.
constexpr TargetBytes(T &data)
From container-like.
Definition SDL3pp_strings.h:383
constexpr TargetBytes(std::span< T, N > span)
From span.
Definition SDL3pp_strings.h:372
constexpr TargetBytes(TargetBytes &&other)=default
Move constructor.
constexpr TargetBytes()=default
Default ctor.
constexpr char * data() const
Retrieves contained data.
Definition SDL3pp_strings.h:418
constexpr TargetBytes(std::nullptr_t)
Disambiguate between multiple pointer types.
Definition SDL3pp_strings.h:341
constexpr TargetBytes(T(&data)[N])
From array.
Definition SDL3pp_strings.h:393
constexpr TargetBytes(std::span< const T, N >)
Just to have better error message.
Definition SDL3pp_strings.h:360
constexpr TargetBytes(const TargetBytes &other)=default
Copy constructor.
constexpr T * data_as() const
Retrieves contained data.
Definition SDL3pp_strings.h:422
constexpr size_t size() const
Retrieves contained size.
Definition SDL3pp_strings.h:412
constexpr size_t size_bytes() const
Retrieves contained size in bytes.
Definition SDL3pp_strings.h:415
constexpr TargetBytes(void *data, size_t size_bytes)
From data + size in bytes.
Definition SDL3pp_strings.h:405
constexpr TargetBytes & operator=(const TargetBytes &other)=default
Copy assignment.
#define SDL_assert(condition)
An assertion test that is normally performed only in debug builds.
Definition SDL3pp_assert.h:321
#define SDL3PP_STRING_PARAM_STRING_VIEW_BUFFERING_COUNT
The number of buffers used to store string views on StringParam.
Definition SDL3pp_strings.h:41
Main include header for the SDL3pp library.
friend StringResult operator+(StringResult lhs, std::string_view rhs)
Append string.
Definition SDL3pp_strings.h:217
StringResult(std::string_view other)
Constructs from string view.
Definition SDL3pp_strings.h:173
constexpr StringResult(StringResult &&other) noexcept
Move ctor.
Definition SDL3pp_strings.h:167
const char * c_str() const
Convert to c-string.
Definition SDL3pp_strings.h:233
friend StringResult operator+(const StringResult &lhs, char rhs)
Append char.
Definition SDL3pp_strings.h:224
StringResult & operator+=(std::string_view other)
Append string.
Definition SDL3pp_strings.h:192
std::string str() const
Convert to string.
Definition SDL3pp_strings.h:230
StringResult(const StringResult &other)
Copy ctor.
Definition SDL3pp_strings.h:161
~StringResult()
Dtor.
Definition SDL3pp_strings.h:180
StringResult & operator+=(char ch)
Append char.
Definition SDL3pp_strings.h:211
constexpr OwnArray(std::nullptr_t=nullptr)
Use parent ctors.
Definition SDL3pp_ownPtr.h:50
constexpr operator std::string_view() const
Convert to std::string_view.
Definition SDL3pp_strings.h:186