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
20
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:
56 StringParam(const char* str = "")
57 : data(str)
58 {
59 }
60
71 StringParam(const std::string& str)
72 : StringParam(str.c_str())
73 {
74 }
75
84 StringParam(std::string&& str)
85 : data(std::move(str))
86 {
87 }
88
98 StringParam(std::string_view str)
99 : StringParam(std::string{str})
100 {
101 }
102
103 StringParam(const StringParam&) = delete;
104 StringParam& operator=(const StringParam&) = delete;
105
108
111
118 const char* c_str() const
119 {
120 struct Visitor
121 {
122 const char* operator()(const char* a) const { return a; }
123 const char* operator()(const std::string& s) const { return s.c_str(); }
124 };
125 return std::visit(Visitor{}, data);
126 }
127
134 operator const char*() const { return c_str(); }
135};
136
137#else // SDL3PP_ENABLE_STRING_PARAM
138
139using StringParam = const char*;
140
141#endif // SDL3PP_ENABLE_STRING_PARAM
142
146struct StringResult : OwnArray<char>
147{
149 using OwnArray::OwnArray;
150
153 : StringResult(std::string_view(other))
154 {
155 }
156
158 constexpr StringResult(StringResult&& other) noexcept
159 : OwnArray(other.release(), other.size())
160 {
161 }
162
164 StringResult(std::string_view other)
165 : OwnArray(other.empty() ? nullptr
166 : SDL_strndup(other.data(), other.size()))
167 {
168 }
169
172
174 operator StringParam() const { return std::string_view{*this}; }
175
177 constexpr operator std::string_view() const
178 {
179 return std::string_view{data(), size()};
180 }
181
183 StringResult& operator+=(std::string_view other)
184 {
185 if (empty()) {
186 reset(StringResult(other).release());
187 } else if (!other.empty()) {
188 size_t lhsSz = size();
189 size_t rhsSz = other.size();
190 size_t finalSize = lhsSz + lhsSz + 1;
191 auto newBuf = static_cast<char*>(SDL_realloc(data(), finalSize));
192 newBuf += lhsSz;
193 SDL_memcpy(newBuf, other.data(), rhsSz);
194 newBuf += rhsSz;
195 *newBuf = 0;
196 reset(newBuf, finalSize - 1);
197 }
198 return *this;
199 }
200
203 {
204 return (*this) += std::string_view{&ch, 1};
205 }
206
208 friend inline StringResult operator+(StringResult lhs, std::string_view rhs)
209 {
210 lhs += rhs;
211 return lhs;
212 }
213
215 friend inline StringResult operator+(const StringResult& lhs, char rhs)
216 {
217 return lhs + std::string_view{&rhs, 1};
218 }
219
221 std::string str() const { return std::string{data(), size()}; }
222
224 const char* c_str() const
225 {
226 if (empty()) return "";
227 return data();
228 }
229};
230
237{
238 const void* m_data;
239 size_t m_size_bytes;
240
241public:
243 constexpr SourceBytes() = default;
244
246 constexpr SourceBytes(std::nullptr_t)
247 : SourceBytes()
248 {
249 }
250
257 template<class T, size_t N>
258 constexpr SourceBytes(std::span<T, N> span)
259 : SourceBytes(span.data(), span.size_bytes())
260 {
261 }
262
268 template<class T>
269 constexpr SourceBytes(const T& data)
270 : SourceBytes(std::span{data.data(), data.size()})
271 {
272 }
273
278 template<class T, size_t N>
279 constexpr SourceBytes(T (&data)[N])
280 : SourceBytes(std::span<T, N>{static_cast<T*>(data), N})
281 {
282 }
283
291 constexpr SourceBytes(const void* data, size_t size_bytes)
292 : m_data(size_bytes > 0 ? data : nullptr)
293 , m_size_bytes(data != nullptr ? size_bytes : 0)
294 {
295 }
296
298 constexpr size_t size() const { return m_size_bytes; }
299
301 constexpr size_t size_bytes() const { return m_size_bytes; }
302
304 constexpr const char* data() const
305 {
306 return static_cast<const char*>(m_data);
307 }
308
310 template<class T>
311 constexpr const T* data_as() const
312 {
313 return static_cast<const T*>(m_data);
314 }
315};
316
323{
324 void* m_data = nullptr;
325 size_t m_size_bytes = 0;
326
327public:
329 constexpr TargetBytes() = default;
330
332 constexpr TargetBytes(std::nullptr_t)
333 : TargetBytes()
334 {
335 }
336
338 constexpr TargetBytes(const TargetBytes& other) = default;
339
341 constexpr TargetBytes(TargetBytes&& other) = default;
342
344 constexpr TargetBytes& operator=(const TargetBytes& other) = default;
345
347 constexpr TargetBytes& operator=(TargetBytes&& other) = default;
348
350 template<class T, size_t N>
351 constexpr TargetBytes(std::span<const T, N>)
352 {
353 static_assert(false, "Non-const type is required");
354 }
355
362 template<class T, size_t N>
363 constexpr TargetBytes(std::span<T, N> span)
364 : TargetBytes(span.data(), span.size_bytes())
365 {
366 }
367
373 template<class T>
374 constexpr TargetBytes(T& data)
375 : TargetBytes(std::span{data.data(), data.size()})
376 {
377 }
378
383 template<class T, size_t N>
384 constexpr TargetBytes(T (&data)[N])
385 : TargetBytes(std::span<T, N>{static_cast<T*>(data), N})
386 {
387 }
388
396 constexpr TargetBytes(void* data, size_t size_bytes)
397 : m_data(size_bytes > 0 ? data : nullptr)
398 , m_size_bytes(data != nullptr ? size_bytes : 0)
399 {
400 }
401
403 constexpr size_t size() const { return m_size_bytes; }
404
406 constexpr size_t size_bytes() const { return m_size_bytes; }
407
409 constexpr char* data() const { return static_cast<char*>(m_data); }
410
412 template<class T>
413 constexpr T* data_as() const
414 {
415 return static_cast<T*>(m_data);
416 }
417};
418
420
421} // namespace SDL
422
423#endif /* SDL3PP_STRINGS_H_ */
constexpr bool empty() const
Definition SDL3pp_ownPtr.h:74
char * release()
Definition SDL3pp_ownPtr.h:91
constexpr OwnArray(std::nullptr_t=nullptr)
Constructor.
Definition SDL3pp_ownPtr.h:50
void reset(char *newValue=nullptr)
Definition SDL3pp_ownPtr.h:99
constexpr size_t size() const
Definition SDL3pp_ownPtr.h:83
constexpr char * data()
Definition SDL3pp_ownPtr.h:77
constexpr SourceBytes(std::span< T, N > span)
From span.
Definition SDL3pp_strings.h:258
constexpr SourceBytes(const T &data)
From container-like.
Definition SDL3pp_strings.h:269
constexpr size_t size_bytes() const
Retrieves contained size in bytes.
Definition SDL3pp_strings.h:301
constexpr SourceBytes(std::nullptr_t)
Disambiguate between multiple pointer types.
Definition SDL3pp_strings.h:246
constexpr SourceBytes(const void *data, size_t size_bytes)
From data + size in bytes.
Definition SDL3pp_strings.h:291
constexpr size_t size() const
Retrieves contained size.
Definition SDL3pp_strings.h:298
constexpr SourceBytes()=default
Default ctor.
constexpr SourceBytes(T(&data)[N])
From array.
Definition SDL3pp_strings.h:279
constexpr const char * data() const
Retrieves contained data.
Definition SDL3pp_strings.h:304
constexpr const T * data_as() const
Retrieves contained data.
Definition SDL3pp_strings.h:311
Helpers to use C++ strings parameters.
Definition SDL3pp_strings.h:43
StringParam & operator=(StringParam &&)=default
Move assignment.
StringParam(const char *str="")
Constructs from a C string.
Definition SDL3pp_strings.h:56
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:71
const char * c_str() const
Converts to a null terminated C string.
Definition SDL3pp_strings.h:118
StringParam(std::string &&str)
Constructs from std::string object.
Definition SDL3pp_strings.h:84
StringParam(StringParam &&)=default
Move ctor.
constexpr TargetBytes & operator=(TargetBytes &&other)=default
Move assignment.
constexpr TargetBytes(T &data)
From container-like.
Definition SDL3pp_strings.h:374
constexpr TargetBytes(std::span< T, N > span)
From span.
Definition SDL3pp_strings.h:363
constexpr TargetBytes(TargetBytes &&other)=default
Move constructor.
constexpr TargetBytes()=default
Default ctor.
constexpr char * data() const
Retrieves contained data.
Definition SDL3pp_strings.h:409
constexpr TargetBytes(std::nullptr_t)
Disambiguate between multiple pointer types.
Definition SDL3pp_strings.h:332
constexpr TargetBytes(T(&data)[N])
From array.
Definition SDL3pp_strings.h:384
constexpr TargetBytes(std::span< const T, N >)
Just to have better error message.
Definition SDL3pp_strings.h:351
constexpr TargetBytes(const TargetBytes &other)=default
Copy constructor.
constexpr T * data_as() const
Retrieves contained data.
Definition SDL3pp_strings.h:413
constexpr size_t size() const
Retrieves contained size.
Definition SDL3pp_strings.h:403
constexpr size_t size_bytes() const
Retrieves contained size in bytes.
Definition SDL3pp_strings.h:406
constexpr TargetBytes(void *data, size_t size_bytes)
From data + size in bytes.
Definition SDL3pp_strings.h:396
constexpr TargetBytes & operator=(const TargetBytes &other)=default
Copy assignment.
Main include header for the SDL3pp library.
friend StringResult operator+(StringResult lhs, std::string_view rhs)
Append string.
Definition SDL3pp_strings.h:208
StringResult(std::string_view other)
Constructs from string view.
Definition SDL3pp_strings.h:164
constexpr StringResult(StringResult &&other) noexcept
Move ctor.
Definition SDL3pp_strings.h:158
const char * c_str() const
Convert to c-string.
Definition SDL3pp_strings.h:224
constexpr OwnArray(std::nullptr_t=nullptr)
Use parent ctors.
Definition SDL3pp_ownPtr.h:50
friend StringResult operator+(const StringResult &lhs, char rhs)
Append char.
Definition SDL3pp_strings.h:215
StringResult & operator+=(std::string_view other)
Append string.
Definition SDL3pp_strings.h:183
std::string str() const
Convert to string.
Definition SDL3pp_strings.h:221
StringResult(const StringResult &other)
Copy ctor.
Definition SDL3pp_strings.h:152
~StringResult()
Dtor.
Definition SDL3pp_strings.h:171
StringResult & operator+=(char ch)
Append char.
Definition SDL3pp_strings.h:202
constexpr operator std::string_view() const
Convert to std::string_view.
Definition SDL3pp_strings.h:177