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_stdinc.h>
9#include "SDL3pp_ownPtr.h"
10
11namespace SDL {
12
21#ifndef SDL3PP_ENABLE_STRING_PARAM
22
23#ifndef SDL3PP_DISABLE_STRING_PARAM
24#define SDL3PP_ENABLE_STRING_PARAM
25#endif // SDL3PP_DISABLE_STRING_PARAM
26
27#endif // SDL3PP_ENABLE_STRING_PARAM
28
29#ifdef SDL3PP_ENABLE_STRING_PARAM
30
43{
44 std::variant<const char*, std::string> data;
45
46public:
48 constexpr StringParam(std::nullptr_t = nullptr)
49 : data("")
50 {
51 }
52
62 constexpr StringParam(const char* str)
63 : data(str ?: "")
64 {
65 }
66
77 constexpr StringParam(const std::string& str)
78 : StringParam(str.c_str())
79 {
80 }
81
90 constexpr StringParam(std::string&& str)
91 : data(std::move(str))
92 {
93 }
94
104 StringParam(std::string_view str)
105 : StringParam(std::string{str})
106 {
107 }
108
109 StringParam(const StringParam&) = delete;
110 StringParam& operator=(const StringParam&) = delete;
111
114
117
124 constexpr const char* c_str() const
125 {
126 struct Visitor
127 {
128 const char* operator()(const char* a) const { return a; }
129 const char* operator()(const std::string& s) const { return s.c_str(); }
130 };
131 return std::visit(Visitor{}, data);
132 }
133
140 constexpr operator const char*() const { return c_str(); }
141};
142
143#else // SDL3PP_ENABLE_STRING_PARAM
144
145using StringParam = const char*;
146
147#endif // SDL3PP_ENABLE_STRING_PARAM
148
152struct StringResult : OwnArray<char>
153{
155 using OwnArray::OwnArray;
156
159 : StringResult(std::string_view(other))
160 {
161 }
162
164 constexpr StringResult(StringResult&& other) noexcept
165 : OwnArray(other.release(), other.size())
166 {
167 }
168
170 StringResult(std::string_view other)
171 : OwnArray(other.empty() ? nullptr
172 : SDL_strndup(other.data(), other.size()))
173 {
174 }
175
177 operator StringParam() const { return std::string_view{*this}; }
178
180 constexpr operator std::string_view() const
181 {
182 return std::string_view{data(), size()};
183 }
184
186 StringResult& operator+=(std::string_view other)
187 {
188 if (empty()) {
189 reset(StringResult(other).release());
190 } else if (!other.empty()) {
191 size_t lhsSz = size();
192 size_t rhsSz = other.size();
193 size_t finalSize = lhsSz + lhsSz + 1;
194 auto newBuf = static_cast<char*>(SDL_realloc(data(), finalSize));
195 newBuf += lhsSz;
196 SDL_memcpy(newBuf, other.data(), rhsSz);
197 newBuf += rhsSz;
198 *newBuf = 0;
199 reset(newBuf, finalSize - 1);
200 }
201 return *this;
202 }
203
206 {
207 return (*this) += std::string_view{&ch, 1};
208 }
209
211 friend inline StringResult operator+(StringResult lhs, std::string_view rhs)
212 {
213 lhs += rhs;
214 return lhs;
215 }
216
218 friend inline StringResult operator+(const StringResult& lhs, char rhs)
219 {
220 return lhs + std::string_view{&rhs, 1};
221 }
222
224 std::string str() const { return std::string{data(), size()}; }
225
227 const char* c_str() const
228 {
229 if (empty()) return "";
230 return data();
231 }
232};
233
240{
241 const void* m_data;
242 size_t m_size_bytes;
243
244public:
246 constexpr SourceBytes() = default;
247
249 constexpr SourceBytes(std::nullptr_t)
250 : SourceBytes()
251 {
252 }
253
260 template<class T, size_t N>
261 constexpr SourceBytes(std::span<T, N> span)
262 : SourceBytes(span.data(), span.size_bytes())
263 {
264 }
265
271 template<class T>
272 constexpr SourceBytes(const T& data)
273 : SourceBytes(std::span{data.data(), data.size()})
274 {
275 }
281 template<class T, size_t N>
282 constexpr SourceBytes(T (&data)[N])
283 : SourceBytes(std::span<T, N>{static_cast<T*>(data), N})
284 {
285 }
286
294 constexpr SourceBytes(const void* data, size_t size_bytes)
295 : m_data(size_bytes > 0 ? data : nullptr)
296 , m_size_bytes(data != nullptr ? size_bytes : 0)
297 {
298 }
299
301 constexpr size_t size() const { return m_size_bytes; }
302
304 constexpr size_t size_bytes() const { return m_size_bytes; }
305
307 constexpr const char* data() const
308 {
309 return static_cast<const char*>(m_data);
310 }
311
313 template<class T>
314 constexpr const T* data_as() const
315 {
316 return static_cast<const T*>(m_data);
317 }
318};
319
326{
327 void* m_data = nullptr;
328 size_t m_size_bytes = 0;
329
330public:
332 constexpr TargetBytes() = default;
333
335 constexpr TargetBytes(std::nullptr_t)
336 : TargetBytes()
337 {
338 }
339
341 constexpr TargetBytes(const TargetBytes& other) = default;
342
344 constexpr TargetBytes(TargetBytes&& other) = default;
345
347 constexpr TargetBytes& operator=(const TargetBytes& other) = default;
348
350 constexpr TargetBytes& operator=(TargetBytes&& other) = default;
351
353 template<class T, size_t N>
354 constexpr TargetBytes(std::span<const T, N>)
355 {
356 static_assert(false, "Non-const type is required");
357 }
358
365 template<class T, size_t N>
366 constexpr TargetBytes(std::span<T, N> span)
367 : TargetBytes(span.data(), span.size_bytes())
368 {
369 }
370
376 template<class T>
377 constexpr TargetBytes(T& data)
378 : TargetBytes(std::span{data.data(), data.size()})
379 {
380 }
386 template<class T, size_t N>
387 constexpr TargetBytes(T (&data)[N])
388 : TargetBytes(std::span<T, N>{static_cast<T*>(data), N})
389 {
390 }
391
399 constexpr TargetBytes(void* data, size_t size_bytes)
400 : m_data(size_bytes > 0 ? data : nullptr)
401 , m_size_bytes(data != nullptr ? size_bytes : 0)
402 {
403 }
404
406 constexpr size_t size() const { return m_size_bytes; }
407
409 constexpr size_t size_bytes() const { return m_size_bytes; }
410
412 constexpr char* data() const { return static_cast<char*>(m_data); }
413
415 template<class T>
416 constexpr T* data_as() const
417 {
418 return static_cast<T*>(m_data);
419 }
420};
421
423
424} // namespace SDL
425
426#endif /* SDL3PP_STRINGS_H_ */
Base class for SDL memory allocated array wrap.
Definition: SDL3pp_ownPtr.h:44
constexpr bool empty() const
True if size() == 0.
Definition: SDL3pp_ownPtr.h:74
char * release()
Release control on object.
Definition: SDL3pp_ownPtr.h:91
constexpr OwnArray(std::nullptr_t=nullptr)
Constructor.
Definition: SDL3pp_ownPtr.h:50
void reset(char *newValue=nullptr)
Reset object.
Definition: SDL3pp_ownPtr.h:99
constexpr size_t size() const
Size.
Definition: SDL3pp_ownPtr.h:83
constexpr char * data()
Data.
Definition: SDL3pp_ownPtr.h:77
Source byte stream.
Definition: SDL3pp_strings.h:240
constexpr SourceBytes(std::span< T, N > span)
From span.
Definition: SDL3pp_strings.h:261
constexpr SourceBytes(const T &data)
From container-like.
Definition: SDL3pp_strings.h:272
constexpr size_t size_bytes() const
Retrieves contained size in bytes.
Definition: SDL3pp_strings.h:304
constexpr SourceBytes(std::nullptr_t)
Disambiguate between multiple pointer types.
Definition: SDL3pp_strings.h:249
constexpr SourceBytes(const void *data, size_t size_bytes)
From data + size in bytes.
Definition: SDL3pp_strings.h:294
constexpr size_t size() const
Retrieves contained size.
Definition: SDL3pp_strings.h:301
constexpr SourceBytes()=default
Default ctor.
constexpr SourceBytes(T(&data)[N])
From array.
Definition: SDL3pp_strings.h:282
constexpr const char * data() const
Retrieves contained data.
Definition: SDL3pp_strings.h:307
constexpr const T * data_as() const
Retrieves contained data.
Definition: SDL3pp_strings.h:314
Helpers to use C++ strings parameters.
Definition: SDL3pp_strings.h:43
constexpr const char * c_str() const
Converts to a null terminated C string.
Definition: SDL3pp_strings.h:124
StringParam & operator=(StringParam &&)=default
Move assignment.
constexpr StringParam(const char *str)
Constructs from a C string.
Definition: SDL3pp_strings.h:62
StringParam(std::string_view str)
Constructs from std::string_view object.
Definition: SDL3pp_strings.h:104
constexpr StringParam(std::string &&str)
Constructs from std::string object.
Definition: SDL3pp_strings.h:90
constexpr StringParam(const std::string &str)
Constructs from std::string reference.
Definition: SDL3pp_strings.h:77
StringParam(StringParam &&)=default
Move ctor.
constexpr StringParam(std::nullptr_t=nullptr)
Default ctor.
Definition: SDL3pp_strings.h:48
Target byte stream.
Definition: SDL3pp_strings.h:326
constexpr TargetBytes & operator=(TargetBytes &&other)=default
Move assignment.
constexpr TargetBytes(T &data)
From container-like.
Definition: SDL3pp_strings.h:377
constexpr TargetBytes(std::span< T, N > span)
From span.
Definition: SDL3pp_strings.h:366
constexpr TargetBytes(TargetBytes &&other)=default
Move constructor.
constexpr TargetBytes()=default
Default ctor.
constexpr char * data() const
Retrieves contained data.
Definition: SDL3pp_strings.h:412
constexpr TargetBytes(std::nullptr_t)
Disambiguate between multiple pointer types.
Definition: SDL3pp_strings.h:335
constexpr TargetBytes(T(&data)[N])
From array.
Definition: SDL3pp_strings.h:387
constexpr TargetBytes(std::span< const T, N >)
Just to have better error message.
Definition: SDL3pp_strings.h:354
constexpr TargetBytes(const TargetBytes &other)=default
Copy constructor.
constexpr T * data_as() const
Retrieves contained data.
Definition: SDL3pp_strings.h:416
constexpr size_t size() const
Retrieves contained size.
Definition: SDL3pp_strings.h:406
constexpr size_t size_bytes() const
Retrieves contained size in bytes.
Definition: SDL3pp_strings.h:409
constexpr TargetBytes(void *data, size_t size_bytes)
From data + size in bytes.
Definition: SDL3pp_strings.h:399
constexpr TargetBytes & operator=(const TargetBytes &other)=default
Copy assignment.
Main include header for the SDL3pp library.
A simple std::string-like interface for SDL allocated strings.
Definition: SDL3pp_strings.h:153
friend StringResult operator+(StringResult lhs, std::string_view rhs)
Append string.
Definition: SDL3pp_strings.h:211
StringResult(std::string_view other)
Constructs from string view.
Definition: SDL3pp_strings.h:170
constexpr StringResult(StringResult &&other) noexcept
Move ctor.
Definition: SDL3pp_strings.h:164
const char * c_str() const
Convert to c-string.
Definition: SDL3pp_strings.h:227
friend StringResult operator+(const StringResult &lhs, char rhs)
Append char.
Definition: SDL3pp_strings.h:218
StringResult & operator+=(std::string_view other)
Append string.
Definition: SDL3pp_strings.h:186
std::string str() const
Convert to string.
Definition: SDL3pp_strings.h:224
StringResult(const StringResult &other)
Copy ctor.
Definition: SDL3pp_strings.h:158
StringResult & operator+=(char ch)
Append char.
Definition: SDL3pp_strings.h:205
constexpr operator std::string_view() const
Convert to std::string_view.
Definition: SDL3pp_strings.h:180