SDL3pp
A slim C++ wrapper for SDL3
Loading...
Searching...
No Matches
SDL3pp_iostream.h
1#ifndef SDL3PP_IOSTREAM_H_
2#define SDL3PP_IOSTREAM_H_
3
4#include <SDL3/SDL_iostream.h>
5#include "SDL3pp_properties.h"
6#include "SDL3pp_stdinc.h"
7
8namespace SDL {
9
23// Forward decl
24struct IOStream;
25
27using IOStreamRaw = SDL_IOStream*;
28
29// Forward decl
30struct IOStreamRef;
31
37using IOStatus = SDL_IOStatus;
38
40 SDL_IO_STATUS_READY;
41
43 SDL_IO_STATUS_ERROR;
44
45constexpr IOStatus IO_STATUS_EOF = SDL_IO_STATUS_EOF;
46
48 SDL_IO_STATUS_NOT_READY;
49
51 SDL_IO_STATUS_READONLY;
52
54 SDL_IO_STATUS_WRITEONLY;
55
64using IOWhence = SDL_IOWhence;
65
67 SDL_IO_SEEK_SET;
68
70 SDL_IO_SEEK_CUR;
71
73 SDL_IO_SEEK_END;
74
89using IOStreamInterface = SDL_IOStreamInterface;
90
104{
105 IOStreamRaw m_resource = nullptr;
106
107public:
109 constexpr IOStream(std::nullptr_t = nullptr) noexcept
110 : m_resource(0)
111 {
112 }
113
121 constexpr explicit IOStream(const IOStreamRaw resource) noexcept
122 : m_resource(resource)
123 {
124 }
125
126protected:
128 constexpr IOStream(const IOStream& other) noexcept = default;
129
130public:
132 constexpr IOStream(IOStream&& other) noexcept
133 : IOStream(other.release())
134 {
135 }
136
137 constexpr IOStream(const IOStreamRef& other) = delete;
138
139 constexpr IOStream(IOStreamRef&& other) = delete;
140
227 static IOStream FromFile(StringParam file, StringParam mode);
228
273 static IOStream FromMem(TargetBytes mem);
274
320
348 static IOStream FromDynamicMem();
349
378 static IOStream Open(const IOStreamInterface& iface, void* userdata);
379
381 ~IOStream() { SDL_CloseIO(m_resource); }
382
384 constexpr IOStream& operator=(IOStream&& other) noexcept
385 {
386 std::swap(m_resource, other.m_resource);
387 return *this;
388 }
389
390protected:
392 constexpr IOStream& operator=(const IOStream& other) noexcept = default;
393
394public:
396 constexpr IOStreamRaw get() const noexcept { return m_resource; }
397
399 constexpr IOStreamRaw release() noexcept
400 {
401 auto r = m_resource;
402 m_resource = nullptr;
403 return r;
404 }
405
407 constexpr auto operator<=>(const IOStream& other) const noexcept = default;
408
410 constexpr explicit operator bool() const noexcept { return !!m_resource; }
411
441 void Close();
442
454
472 IOStatus GetStatus() const;
473
484 Sint64 GetSize() const;
485
511 Sint64 Seek(Sint64 offset, IOWhence whence);
512
529 Sint64 Tell() const;
530
553 std::string Read(size_t size = -1)
554 {
555 Sint64 pos = Tell();
556 auto curSize = SDL_GetIOSize(get());
557 if ((curSize < 0 || pos < 0)) {
558 if (size == size_t(-1)) return {};
559 } else if (curSize - pos <= 0) {
560 return {};
561 } else if (curSize - pos < size) {
562 size = curSize - pos;
563 }
564 std::string result(size, 0);
565 auto actualSize = Read(result);
566 if (actualSize < size) result.resize(actualSize);
567 return result;
568 }
569
596 size_t Read(TargetBytes buf);
597
630 size_t Write(SourceBytes buf);
631
639 size_t print(std::string_view fmt, auto... args)
640 {
641 return Write(std::vformat(fmt, std::make_format_args(args...)));
642 }
643
651 size_t println(std::string_view fmt, auto... args)
652 {
653 std::string result =
654 std::vformat(fmt, std::make_format_args(args...)) + "\n";
655 return Write(result);
656 }
657
678 size_t printf(SDL_PRINTF_FORMAT_STRING const char* fmt, ...)
679 {
680 va_list ap;
681 size_t result;
682
683 va_start(ap, fmt);
684 result = vprintf(fmt, ap);
685 va_end(ap);
686
687 return result;
688 }
689
709 size_t vprintf(SDL_PRINTF_FORMAT_STRING const char* fmt, va_list ap);
710
727 void Flush();
728
746
764 template<class T>
766 {
767 size_t datasize = 0;
768 auto data = static_cast<T*>(SDL_LoadFile_IO(get(), &datasize, false));
769 return OwnArray<T>{CheckError(data), datasize / sizeof(T)};
770 }
771
786 void SaveFile(SourceBytes data);
787
804
821
842
863
884
905
926
947
968
989
1009 Uint64 ReadU64LE();
1010
1030 Sint64 ReadS64LE();
1031
1051 Uint64 ReadU64BE();
1052
1072 Sint64 ReadS64BE();
1073
1088 std::optional<Uint8> TryReadU8()
1089 {
1090 if (Uint8 value; SDL_ReadU8(get(), &value)) return value;
1091 return {};
1092 }
1093
1108 std::optional<Sint8> TryReadS8()
1109 {
1110 if (Sint8 value; SDL_ReadS8(get(), &value)) return value;
1111 return {};
1112 }
1113
1132 std::optional<Uint16> TryReadU16LE()
1133 {
1134 if (Uint16 value; SDL_ReadU16LE(get(), &value)) return value;
1135 return {};
1136 }
1137
1156 std::optional<Sint16> TryReadS16LE()
1157 {
1158 if (Sint16 value; SDL_ReadS16LE(get(), &value)) return value;
1159 return {};
1160 }
1161
1180 std::optional<Uint16> TryReadU16BE()
1181 {
1182 if (Uint16 value; SDL_ReadU16BE(get(), &value)) return value;
1183 return {};
1184 }
1185
1204 std::optional<Sint16> TryReadS16BE()
1205 {
1206 if (Sint16 value; SDL_ReadS16BE(get(), &value)) return value;
1207 return {};
1208 }
1209
1228 std::optional<Uint32> TryReadU32LE()
1229 {
1230 if (Uint32 value; SDL_ReadU32LE(get(), &value)) return value;
1231 return {};
1232 }
1233
1252 std::optional<Sint32> TryReadS32LE()
1253 {
1254 if (Sint32 value; SDL_ReadS32LE(get(), &value)) return value;
1255 return {};
1256 }
1257
1276 std::optional<Uint32> TryReadU32BE()
1277 {
1278 if (Uint32 value; SDL_ReadU32BE(get(), &value)) return value;
1279 return {};
1280 }
1281
1300 std::optional<Sint32> TryReadS32BE()
1301 {
1302 if (Sint32 value; SDL_ReadS32BE(get(), &value)) return value;
1303 return {};
1304 }
1305
1324 std::optional<Uint64> TryReadU64LE()
1325 {
1326 if (Uint64 value; SDL_ReadU64LE(get(), &value)) return value;
1327 return {};
1328 }
1329
1348 std::optional<Sint64> TryReadS64LE()
1349 {
1350 if (Sint64 value; SDL_ReadS64LE(get(), &value)) return value;
1351 return {};
1352 }
1353
1372 std::optional<Uint64> TryReadU64BE()
1373 {
1374 if (Uint64 value; SDL_ReadU64BE(get(), &value)) return value;
1375 return {};
1376 }
1377
1396 std::optional<Sint64> TryReadS64BE()
1397 {
1398 if (Sint64 value; SDL_ReadS64BE(get(), &value)) return value;
1399 return {};
1400 }
1401
1412 void WriteU8(Uint8 value);
1413
1424 void WriteS8(Sint8 value);
1425
1441 void WriteU16LE(Uint16 value);
1442
1458 void WriteS16LE(Sint16 value);
1459
1474 void WriteU16BE(Uint16 value);
1475
1490 void WriteS16BE(Sint16 value);
1491
1507 void WriteU32LE(Uint32 value);
1508
1524 void WriteS32LE(Sint32 value);
1525
1540 void WriteU32BE(Uint32 value);
1541
1556 void WriteS32BE(Sint32 value);
1557
1573 void WriteU64LE(Uint64 value);
1574
1590 void WriteS64LE(Sint64 value);
1591
1606 void WriteU64BE(Uint64 value);
1607
1622 void WriteS64BE(Sint64 value);
1623};
1624
1631{
1632 using IOStream::IOStream;
1633
1641 IOStreamRef(IOStreamRaw resource) noexcept
1642 : IOStream(resource)
1643 {
1644 }
1645
1653 constexpr IOStreamRef(const IOStream& resource) noexcept
1654 : IOStream(resource.get())
1655 {
1656 }
1657
1659 constexpr IOStreamRef(const IOStreamRef& other) noexcept
1660 : IOStream(other.get())
1661 {
1662 }
1663
1665 constexpr IOStreamRef(IOStreamRef&& other) noexcept
1666 : IOStream(other.release())
1667 {
1668 }
1669
1672
1674 constexpr IOStreamRef& operator=(IOStreamRef other) noexcept
1675 {
1676 std::swap(*this, other);
1677 return *this;
1678 }
1679
1681 constexpr operator IOStreamRaw() const noexcept { return get(); }
1682};
1683
1767{
1768 return IOStream(SDL_IOFromFile(file, mode));
1769}
1770
1772{
1773 return SDL::IOFromFile(std::move(file), std::move(mode));
1774}
1775
1776namespace prop::IOStream {
1777
1778constexpr auto WINDOWS_HANDLE_POINTER =
1779 SDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER;
1780
1781constexpr auto STDIO_FILE_POINTER = SDL_PROP_IOSTREAM_STDIO_FILE_POINTER;
1782
1783constexpr auto FILE_DESCRIPTOR_NUMBER =
1784 SDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER;
1785
1786constexpr auto ANDROID_AASSET_POINTER =
1787 SDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER;
1788
1789constexpr auto MEMORY_POINTER = SDL_PROP_IOSTREAM_MEMORY_POINTER;
1790
1791constexpr auto MEMORY_SIZE_NUMBER = SDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER;
1792
1793#if SDL_VERSION_ATLEAST(3, 4, 0)
1794
1795constexpr auto MEMORY_FREE_FUNC_POINTER =
1796 SDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER;
1797
1798#endif // SDL_VERSION_ATLEAST(3, 4, 0)
1799
1800constexpr auto DYNAMIC_MEMORY_POINTER =
1801 SDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER;
1802
1803constexpr auto DYNAMIC_CHUNKSIZE_NUMBER =
1804 SDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER;
1805
1806} // namespace prop::IOStream
1807
1852{
1853 return IOStream(CheckError(SDL_IOFromMem(mem.data(), mem.size_bytes())));
1854}
1855
1857{
1858 return SDL::IOFromMem(std::move(mem));
1859}
1860
1905{
1906 return IOStream(CheckError(SDL_IOFromConstMem(mem.data(), mem.size_bytes())));
1907}
1908
1910{
1911 return SDL::IOFromConstMem(std::move(mem));
1912}
1913
1941inline IOStream IOFromDynamicMem() { return IOStream(SDL_IOFromDynamicMem()); }
1942
1944
1972inline IOStream OpenIO(const IOStreamInterface& iface, void* userdata)
1973{
1974 return IOStream(CheckError(SDL_OpenIO(&iface, userdata)));
1975}
1976
1977inline IOStream IOStream::Open(const IOStreamInterface& iface, void* userdata)
1978{
1979 return SDL::OpenIO(iface, userdata);
1980}
1981
2011inline void CloseIO(IOStreamRaw context) { CheckError(SDL_CloseIO(context)); }
2012
2013inline void IOStream::Close() { CloseIO(release()); }
2014
2027{
2028 return {CheckError(SDL_GetIOProperties(context))};
2029}
2030
2032{
2033 return SDL::GetIOProperties(m_resource);
2034}
2035
2055{
2056 return SDL_GetIOStatus(context);
2057}
2058
2060{
2061 return SDL::GetIOStatus(m_resource);
2062}
2063
2076{
2077 return CheckError(SDL_GetIOSize(context));
2078}
2079
2080inline Sint64 IOStream::GetSize() const { return SDL::GetIOSize(m_resource); }
2081
2108inline Sint64 SeekIO(IOStreamRef context, Sint64 offset, IOWhence whence)
2109{
2110 return SDL_SeekIO(context, offset, whence);
2111}
2112
2113inline Sint64 IOStream::Seek(Sint64 offset, IOWhence whence)
2114{
2115 return SDL::SeekIO(m_resource, offset, whence);
2116}
2117
2136inline Sint64 TellIO(IOStreamRef context) { return SDL_TellIO(context); }
2137
2138inline Sint64 IOStream::Tell() const { return SDL::TellIO(m_resource); }
2139
2167inline size_t ReadIO(IOStreamRef context, TargetBytes buf)
2168{
2169 return SDL_ReadIO(context, buf.data(), buf.size_bytes());
2170}
2171
2172inline size_t IOStream::Read(TargetBytes buf)
2173{
2174 return SDL::ReadIO(m_resource, std::move(buf));
2175}
2176
2210inline size_t WriteIO(IOStreamRef context, SourceBytes buf)
2211{
2212 return SDL_WriteIO(context, buf.data(), buf.size_bytes());
2213}
2214
2216{
2217 return SDL::WriteIO(m_resource, std::move(buf));
2218}
2219
2241inline size_t IOprintf(IOStreamRef context,
2242 SDL_PRINTF_FORMAT_STRING const char* fmt,
2243 ...)
2244{
2245 va_list ap;
2246 size_t result;
2247
2248 va_start(ap, fmt);
2249 result = SDL_IOvprintf(context, fmt, ap);
2250 va_end(ap);
2251
2252 return result;
2253}
2254
2273inline size_t IOvprintf(IOStreamRef context,
2274 SDL_PRINTF_FORMAT_STRING const char* fmt,
2275 va_list ap)
2276{
2277 return SDL_IOvprintf(context, fmt, ap);
2278}
2279
2280inline size_t IOStream::vprintf(SDL_PRINTF_FORMAT_STRING const char* fmt,
2281 va_list ap)
2282{
2283 return SDL::IOvprintf(m_resource, fmt, ap);
2284}
2285
2303inline void FlushIO(IOStreamRef context) { CheckError(SDL_FlushIO(context)); }
2304
2305inline void IOStream::Flush() { SDL::FlushIO(m_resource); }
2306
2329inline StringResult LoadFile(IOStreamRef src, bool closeio = true)
2330{
2331 size_t datasize = 0;
2332 auto data = static_cast<char*>(SDL_LoadFile_IO(src, &datasize, closeio));
2333 return StringResult{CheckError(data), datasize};
2334}
2335
2355{
2356 size_t datasize = 0;
2357 auto data = static_cast<char*>(SDL_LoadFile(file, &datasize));
2358 return StringResult{CheckError(data), datasize};
2359}
2360
2362{
2363 return SDL::LoadFile(m_resource, false);
2364}
2365
2384template<class T>
2386{
2387 size_t datasize = 0;
2388 auto data = static_cast<T*>(SDL_LoadFile(file, &datasize));
2389 return OwnArray<T>{CheckError(data), datasize / sizeof(T)};
2390}
2391
2408inline void SaveFile(IOStreamRef src, SourceBytes data, bool closeio = false)
2409{
2410 CheckError(SDL_SaveFile_IO(src, data.data(), data.size_bytes(), closeio));
2411}
2412
2427inline void SaveFile(StringParam file, SourceBytes data)
2428{
2429 CheckError(SDL_SaveFile(file, data.data(), data.size_bytes()));
2430}
2431
2433{
2434 SDL::SaveFile(m_resource, std::move(data));
2435}
2436
2454{
2455 Uint8 value;
2456 CheckError(SDL_ReadU8(src, &value));
2457 return value;
2458}
2459
2477{
2478 Sint8 value;
2479 CheckError(SDL_ReadS8(src, &value));
2480 return value;
2481}
2482
2504{
2505 Uint16 value;
2506 CheckError(SDL_ReadU16LE(src, &value));
2507 return value;
2508}
2509
2510inline Uint16 IOStream::ReadU16LE() { return SDL::ReadU16LE(m_resource); }
2511
2533{
2534 Sint16 value;
2535 CheckError(SDL_ReadS16LE(src, &value));
2536 return value;
2537}
2538
2539inline Sint16 IOStream::ReadS16LE() { return SDL::ReadS16LE(m_resource); }
2540
2562{
2563 Uint16 value;
2564 CheckError(SDL_ReadU16BE(src, &value));
2565 return value;
2566}
2567
2568inline Uint16 IOStream::ReadU16BE() { return SDL::ReadU16BE(m_resource); }
2569
2591{
2592 Sint16 value;
2593 CheckError(SDL_ReadS16BE(src, &value));
2594 return value;
2595}
2596
2597inline Sint16 IOStream::ReadS16BE() { return SDL::ReadS16BE(m_resource); }
2598
2620{
2621 Uint32 value;
2622 CheckError(SDL_ReadU32LE(src, &value));
2623 return value;
2624}
2625
2626inline Uint32 IOStream::ReadU32LE() { return SDL::ReadU32LE(m_resource); }
2627
2649{
2650 Sint32 value;
2651 CheckError(SDL_ReadS32LE(src, &value));
2652 return value;
2653}
2654
2655inline Sint32 IOStream::ReadS32LE() { return SDL::ReadS32LE(m_resource); }
2656
2678{
2679 Uint32 value;
2680 CheckError(SDL_ReadU32BE(src, &value));
2681 return value;
2682}
2683
2684inline Uint32 IOStream::ReadU32BE() { return SDL::ReadU32BE(m_resource); }
2685
2707{
2708 Sint32 value;
2709 CheckError(SDL_ReadS32BE(src, &value));
2710 return value;
2711}
2712
2713inline Sint32 IOStream::ReadS32BE() { return SDL::ReadS32BE(m_resource); }
2714
2736{
2737 Uint64 value;
2738 CheckError(SDL_ReadU64LE(src, &value));
2739 return value;
2740}
2741
2742inline Uint64 IOStream::ReadU64LE() { return SDL::ReadU64LE(m_resource); }
2743
2765{
2766 Sint64 value;
2767 CheckError(SDL_ReadS64LE(src, &value));
2768 return value;
2769}
2770
2771inline Sint64 IOStream::ReadS64LE() { return SDL::ReadS64LE(m_resource); }
2772
2794{
2795 Uint64 value;
2796 CheckError(SDL_ReadU64BE(src, &value));
2797 return value;
2798}
2799
2800inline Uint64 IOStream::ReadU64BE() { return SDL::ReadU64BE(m_resource); }
2801
2823{
2824 Sint64 value;
2825 CheckError(SDL_ReadS64BE(src, &value));
2826 return value;
2827}
2828
2829inline Sint64 IOStream::ReadS64BE() { return SDL::ReadS64BE(m_resource); }
2830
2842inline void WriteU8(IOStreamRef dst, Uint8 value)
2843{
2844 CheckError(SDL_WriteU8(dst, value));
2845}
2846
2847inline void IOStream::WriteU8(Uint8 value) { SDL::WriteU8(m_resource, value); }
2848
2860inline void WriteS8(IOStreamRef dst, Sint8 value)
2861{
2862 CheckError(SDL_WriteS8(dst, value));
2863}
2864
2865inline void IOStream::WriteS8(Sint8 value) { SDL::WriteS8(m_resource, value); }
2866
2882inline void WriteU16LE(IOStreamRef dst, Uint16 value)
2883{
2884 CheckError(SDL_WriteU16LE(dst, value));
2885}
2886
2888{
2889 SDL::WriteU16LE(m_resource, value);
2890}
2891
2907inline void WriteS16LE(IOStreamRef dst, Sint16 value)
2908{
2909 CheckError(SDL_WriteS16LE(dst, value));
2910}
2911
2913{
2914 SDL::WriteS16LE(m_resource, value);
2915}
2916
2932inline void WriteU16BE(IOStreamRef dst, Uint16 value)
2933{
2934 CheckError(SDL_WriteU16BE(dst, value));
2935}
2936
2938{
2939 SDL::WriteU16BE(m_resource, value);
2940}
2941
2957inline void WriteS16BE(IOStreamRef dst, Sint16 value)
2958{
2959 CheckError(SDL_WriteS16BE(dst, value));
2960}
2961
2963{
2964 SDL::WriteS16BE(m_resource, value);
2965}
2966
2982inline void WriteU32LE(IOStreamRef dst, Uint32 value)
2983{
2984 CheckError(SDL_WriteU32LE(dst, value));
2985}
2986
2988{
2989 SDL::WriteU32LE(m_resource, value);
2990}
2991
3007inline void WriteS32LE(IOStreamRef dst, Sint32 value)
3008{
3009 CheckError(SDL_WriteS32LE(dst, value));
3010}
3011
3013{
3014 SDL::WriteS32LE(m_resource, value);
3015}
3016
3032inline void WriteU32BE(IOStreamRef dst, Uint32 value)
3033{
3034 CheckError(SDL_WriteU32BE(dst, value));
3035}
3036
3038{
3039 SDL::WriteU32BE(m_resource, value);
3040}
3041
3057inline void WriteS32BE(IOStreamRef dst, Sint32 value)
3058{
3059 CheckError(SDL_WriteS32BE(dst, value));
3060}
3061
3063{
3064 SDL::WriteS32BE(m_resource, value);
3065}
3066
3082inline void WriteU64LE(IOStreamRef dst, Uint64 value)
3083{
3084 CheckError(SDL_WriteU64LE(dst, value));
3085}
3086
3088{
3089 SDL::WriteU64LE(m_resource, value);
3090}
3091
3107inline void WriteS64LE(IOStreamRef dst, Sint64 value)
3108{
3109 CheckError(SDL_WriteS64LE(dst, value));
3110}
3111
3113{
3114 SDL::WriteS64LE(m_resource, value);
3115}
3116
3132inline void WriteU64BE(IOStreamRef dst, Uint64 value)
3133{
3134 CheckError(SDL_WriteU64BE(dst, value));
3135}
3136
3138{
3139 SDL::WriteU64BE(m_resource, value);
3140}
3141
3157inline void WriteS64BE(IOStreamRef dst, Sint64 value)
3158{
3159 CheckError(SDL_WriteS64BE(dst, value));
3160}
3161
3163{
3164 SDL::WriteS64BE(m_resource, value);
3165}
3166
3168
3169} // namespace SDL
3170
3171#endif /* SDL3PP_IOSTREAM_H_ */
The read/write operation structure.
Definition: SDL3pp_iostream.h:104
Sint8 ReadS8()
Use this function to read a signed byte from an IOStream.
std::optional< Sint8 > TryReadS8()
Use this function to read a byte from an IOStreamRef.
Definition: SDL3pp_iostream.h:1108
std::optional< Sint16 > TryReadS16LE()
Use this function to read 16 bits of little-endian data from an IOStreamRef and return in native form...
Definition: SDL3pp_iostream.h:1156
constexpr IOStream(const IOStream &other) noexcept=default
Copy constructor.
std::optional< Uint64 > TryReadU64BE()
Use this function to read 64 bits of big-endian data from an IOStreamRef and return in native format.
Definition: SDL3pp_iostream.h:1372
constexpr IOStreamRaw release() noexcept
Retrieves underlying IOStreamRaw and clear this.
Definition: SDL3pp_iostream.h:399
std::optional< Uint16 > TryReadU16BE()
Use this function to read 16 bits of big-endian data from an IOStreamRef and return in native format.
Definition: SDL3pp_iostream.h:1180
constexpr IOStream(std::nullptr_t=nullptr) noexcept
Default ctor.
Definition: SDL3pp_iostream.h:109
~IOStream()
Destructor.
Definition: SDL3pp_iostream.h:381
std::optional< Sint32 > TryReadS32LE()
Use this function to read 32 bits of little-endian data from an IOStreamRef and return in native form...
Definition: SDL3pp_iostream.h:1252
std::optional< Uint16 > TryReadU16LE()
Use this function to read 16 bits of little-endian data from an IOStreamRef and return in native form...
Definition: SDL3pp_iostream.h:1132
constexpr IOStreamRaw get() const noexcept
Retrieves underlying IOStreamRaw.
Definition: SDL3pp_iostream.h:396
OwnArray< T > LoadFileAs()
Load all the data from an SDL data stream.
Definition: SDL3pp_iostream.h:765
std::optional< Sint16 > TryReadS16BE()
Use this function to read 16 bits of big-endian data from an IOStreamRef and return in native format.
Definition: SDL3pp_iostream.h:1204
size_t printf(SDL_PRINTF_FORMAT_STRING const char *fmt,...)
Print to an IOStream data stream.
Definition: SDL3pp_iostream.h:678
constexpr IOStream & operator=(const IOStream &other) noexcept=default
Assignment operator.
Uint8 ReadU8()
Use this function to read a byte from an IOStream.
std::optional< Uint64 > TryReadU64LE()
Use this function to read 64 bits of little-endian data from an IOStreamRef and return in native form...
Definition: SDL3pp_iostream.h:1324
constexpr IOStream(IOStream &&other) noexcept
Move constructor.
Definition: SDL3pp_iostream.h:132
size_t print(std::string_view fmt, auto... args)
Prints formatted string.
Definition: SDL3pp_iostream.h:639
std::optional< Uint32 > TryReadU32LE()
Use this function to read 32 bits of little-endian data from an IOStreamRef and return in native form...
Definition: SDL3pp_iostream.h:1228
std::optional< Uint8 > TryReadU8()
Use this function to read a byte from an IOStreamRef.
Definition: SDL3pp_iostream.h:1088
constexpr IOStream & operator=(IOStream &&other) noexcept
Assignment operator.
Definition: SDL3pp_iostream.h:384
std::optional< Uint32 > TryReadU32BE()
Use this function to read 32 bits of big-endian data from an IOStreamRef and return in native format.
Definition: SDL3pp_iostream.h:1276
std::optional< Sint32 > TryReadS32BE()
Use this function to read 32 bits of big-endian data from an IOStreamRef and return in native format.
Definition: SDL3pp_iostream.h:1300
std::optional< Sint64 > TryReadS64BE()
Use this function to read 64 bits of big-endian data from an IOStreamRef and return in native format.
Definition: SDL3pp_iostream.h:1396
constexpr IOStream(const IOStreamRaw resource) noexcept
Constructs from IOStreamRef.
Definition: SDL3pp_iostream.h:121
size_t println(std::string_view fmt, auto... args)
Prints formatted string.
Definition: SDL3pp_iostream.h:651
constexpr auto operator<=>(const IOStream &other) const noexcept=default
Comparison.
std::optional< Sint64 > TryReadS64LE()
Use this function to read 64 bits of little-endian data from an IOStreamRef and return in native form...
Definition: SDL3pp_iostream.h:1348
std::string Read(size_t size=-1)
Read from a data source.
Definition: SDL3pp_iostream.h:553
Base class for SDL memory allocated array wrap.
Definition: SDL3pp_ownPtr.h:44
Source byte stream.
Definition: SDL3pp_strings.h:240
constexpr size_t size_bytes() const
Retrieves contained size in bytes.
Definition: SDL3pp_strings.h:304
constexpr const char * data() const
Retrieves contained data.
Definition: SDL3pp_strings.h:307
Helpers to use C++ strings parameters.
Definition: SDL3pp_strings.h:43
Target byte stream.
Definition: SDL3pp_strings.h:326
constexpr char * data() const
Retrieves contained data.
Definition: SDL3pp_strings.h:412
constexpr size_t size_bytes() const
Retrieves contained size in bytes.
Definition: SDL3pp_strings.h:409
constexpr void CheckError(bool result)
Check and throw if returned value from SDL is an error.
Definition: SDL3pp_error.h:197
void WriteS16BE(IOStreamRef dst, Sint16 value)
Use this function to write 16 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:2957
Sint64 GetSize() const
Use this function to get the size of the data stream in an IOStream.
Definition: SDL3pp_iostream.h:2080
IOStream IOFromMem(TargetBytes mem)
Use this function to prepare a read-write memory buffer for use with IOStream.
Definition: SDL3pp_iostream.h:1851
size_t ReadIO(IOStreamRef context, TargetBytes buf)
Read from a data source.
Definition: SDL3pp_iostream.h:2167
void FlushIO(IOStreamRef context)
Flush any buffered data in the stream.
Definition: SDL3pp_iostream.h:2303
void WriteS64BE(IOStreamRef dst, Sint64 value)
Use this function to write 64 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:3157
void WriteU32LE(Uint32 value)
Use this function to write 32 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:2987
void WriteS32BE(Sint32 value)
Use this function to write 32 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:3062
void WriteS32LE(Sint32 value)
Use this function to write 32 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:3012
void WriteU64LE(IOStreamRef dst, Uint64 value)
Use this function to write 64 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:3082
void WriteU64BE(Uint64 value)
Use this function to write 64 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:3137
void WriteU64BE(IOStreamRef dst, Uint64 value)
Use this function to write 64 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:3132
IOStream OpenIO(const IOStreamInterface &iface, void *userdata)
Create a custom IOStream.
Definition: SDL3pp_iostream.h:1972
PropertiesRef GetIOProperties(IOStreamRef context)
Get the properties associated with an IOStream.
Definition: SDL3pp_iostream.h:2026
Uint16 ReadU16BE()
Use this function to read 16 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2568
SDL_IOStream * IOStreamRaw
Alias to raw representation for IOStream.
Definition: SDL3pp_iostream.h:27
void WriteU32BE(IOStreamRef dst, Uint32 value)
Use this function to write 32 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:3032
void SaveFile(SourceBytes data)
Save all the data into an SDL data stream.
Definition: SDL3pp_iostream.h:2432
size_t WriteIO(IOStreamRef context, SourceBytes buf)
Write to an IOStream data stream.
Definition: SDL3pp_iostream.h:2210
void WriteU8(IOStreamRef dst, Uint8 value)
Use this function to write a byte to an IOStream.
Definition: SDL3pp_iostream.h:2842
void WriteU32BE(Uint32 value)
Use this function to write 32 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:3037
Sint64 TellIO(IOStreamRef context)
Determine the current read/write offset in an IOStream data stream.
Definition: SDL3pp_iostream.h:2136
Sint32 ReadS32BE()
Use this function to read 32 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2713
Sint64 ReadS64BE(IOStreamRef src)
Use this function to read 64 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2822
void WriteS16LE(Sint16 value)
Use this function to write 16 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:2912
void WriteS8(Sint8 value)
Use this function to write a signed byte to an IOStream.
Definition: SDL3pp_iostream.h:2865
void WriteS32LE(IOStreamRef dst, Sint32 value)
Use this function to write 32 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:3007
size_t IOprintf(IOStreamRef context, SDL_PRINTF_FORMAT_STRING const char *fmt,...)
Print to an IOStream data stream.
Definition: SDL3pp_iostream.h:2241
Uint32 ReadU32BE(IOStreamRef src)
Use this function to read 32 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2677
void Flush()
Flush any buffered data in the stream.
Definition: SDL3pp_iostream.h:2305
IOStream IOFromConstMem(SourceBytes mem)
Use this function to prepare a read-only memory buffer for use with IOStream.
Definition: SDL3pp_iostream.h:1904
SDL_IOWhence IOWhence
Possible whence values for IOStream seeking.
Definition: SDL3pp_iostream.h:64
Sint32 ReadS32LE(IOStreamRef src)
Use this function to read 32 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2648
Sint32 ReadS32BE(IOStreamRef src)
Use this function to read 32 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2706
size_t vprintf(SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap)
Print to an IOStream data stream.
Definition: SDL3pp_iostream.h:2280
Uint16 ReadU16LE()
Use this function to read 16 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2510
void WriteS32BE(IOStreamRef dst, Sint32 value)
Use this function to write 32 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:3057
void SaveFile(IOStreamRef src, SourceBytes data, bool closeio=false)
Save all the data into an SDL data stream.
Definition: SDL3pp_iostream.h:2408
Uint32 ReadU32LE()
Use this function to read 32 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2626
IOStream IOFromDynamicMem()
Use this function to create an IOStream that is backed by dynamically allocated memory.
Definition: SDL3pp_iostream.h:1941
void Close()
Close and free an allocated IOStream structure.
Definition: SDL3pp_iostream.h:2013
OwnArray< T > LoadFileAs(StringParam file)
Load all the data from a file path.
Definition: SDL3pp_iostream.h:2385
void WriteS64BE(Sint64 value)
Use this function to write 64 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:3162
Uint8 ReadU8(IOStreamRef src)
Use this function to read a byte from an IOStream.
Definition: SDL3pp_iostream.h:2453
constexpr IOStatus IO_STATUS_ERROR
Read or write I/O error.
Definition: SDL3pp_iostream.h:42
Uint16 ReadU16LE(IOStreamRef src)
Use this function to read 16 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2503
void WriteS16BE(Sint16 value)
Use this function to write 16 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:2962
static IOStream Open(const IOStreamInterface &iface, void *userdata)
Create a custom IOStream.
Definition: SDL3pp_iostream.h:1977
StringResult LoadFile(IOStreamRef src, bool closeio=true)
Load all the data from an SDL data stream.
Definition: SDL3pp_iostream.h:2329
void WriteS64LE(IOStreamRef dst, Sint64 value)
Use this function to write 64 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:3107
Uint32 ReadU32BE()
Use this function to read 32 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2684
IOStream IOFromFile(StringParam file, StringParam mode)
Use this function to create a new IOStream structure for reading from and/or writing to a named file.
Definition: SDL3pp_iostream.h:1766
constexpr IOStatus IO_STATUS_EOF
End of file.
Definition: SDL3pp_iostream.h:45
void WriteS16LE(IOStreamRef dst, Sint16 value)
Use this function to write 16 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:2907
IOStatus GetIOStatus(IOStreamRef context)
Query the stream status of an IOStream.
Definition: SDL3pp_iostream.h:2054
Sint64 GetIOSize(IOStreamRef context)
Use this function to get the size of the data stream in an IOStream.
Definition: SDL3pp_iostream.h:2075
Sint64 Seek(Sint64 offset, IOWhence whence)
Seek within an IOStream data stream.
Definition: SDL3pp_iostream.h:2113
Uint32 ReadU32LE(IOStreamRef src)
Use this function to read 32 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2619
size_t Write(SourceBytes buf)
Write to an IOStream data stream.
Definition: SDL3pp_iostream.h:2215
void WriteS8(IOStreamRef dst, Sint8 value)
Use this function to write a signed byte to an IOStream.
Definition: SDL3pp_iostream.h:2860
Sint64 Tell() const
Determine the current read/write offset in an IOStream data stream.
Definition: SDL3pp_iostream.h:2138
Sint64 ReadS64LE(IOStreamRef src)
Use this function to read 64 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2764
size_t IOvprintf(IOStreamRef context, SDL_PRINTF_FORMAT_STRING const char *fmt, va_list ap)
Print to an IOStream data stream.
Definition: SDL3pp_iostream.h:2273
void WriteU16BE(Uint16 value)
Use this function to write 16 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:2937
Sint32 ReadS32LE()
Use this function to read 32 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2655
Sint16 ReadS16BE()
Use this function to read 16 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2597
constexpr IOStatus IO_STATUS_WRITEONLY
Tried to read a write-only buffer.
Definition: SDL3pp_iostream.h:53
Uint16 ReadU16BE(IOStreamRef src)
Use this function to read 16 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2561
Sint8 ReadS8(IOStreamRef src)
Use this function to read a signed byte from an IOStream.
Definition: SDL3pp_iostream.h:2476
Sint16 ReadS16BE(IOStreamRef src)
Use this function to read 16 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2590
void WriteU16LE(IOStreamRef dst, Uint16 value)
Use this function to write 16 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:2882
Sint64 SeekIO(IOStreamRef context, Sint64 offset, IOWhence whence)
Seek within an IOStream data stream.
Definition: SDL3pp_iostream.h:2108
Sint64 ReadS64BE()
Use this function to read 64 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2829
static IOStream FromDynamicMem()
Use this function to create an IOStream that is backed by dynamically allocated memory.
Definition: SDL3pp_iostream.h:1943
void WriteU32LE(IOStreamRef dst, Uint32 value)
Use this function to write 32 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:2982
static IOStream FromConstMem(SourceBytes mem)
Use this function to prepare a read-only memory buffer for use with IOStream.
Definition: SDL3pp_iostream.h:1909
StringResult LoadFile()
Load all the data from an SDL data stream.
Definition: SDL3pp_iostream.h:2361
void WriteU16LE(Uint16 value)
Use this function to write 16 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:2887
Uint64 ReadU64BE(IOStreamRef src)
Use this function to read 64 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2793
Uint64 ReadU64LE()
Use this function to read 64 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2742
Sint16 ReadS16LE(IOStreamRef src)
Use this function to read 16 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2532
constexpr IOWhence IO_SEEK_CUR
Seek relative to current read point.
Definition: SDL3pp_iostream.h:69
SDL_IOStreamInterface IOStreamInterface
The function pointers that drive an IOStream.
Definition: SDL3pp_iostream.h:89
void WriteU8(Uint8 value)
Use this function to write a byte to an IOStream.
Definition: SDL3pp_iostream.h:2847
Uint64 ReadU64BE()
Use this function to read 64 bits of big-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2800
SDL_IOStatus IOStatus
IOStream status, set by a read or write operation.
Definition: SDL3pp_iostream.h:37
Sint64 ReadS64LE()
Use this function to read 64 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2771
Uint64 ReadU64LE(IOStreamRef src)
Use this function to read 64 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2735
void WriteU16BE(IOStreamRef dst, Uint16 value)
Use this function to write 16 bits in native format to an IOStream as big-endian data.
Definition: SDL3pp_iostream.h:2932
constexpr IOStatus IO_STATUS_READONLY
Tried to write a read-only buffer.
Definition: SDL3pp_iostream.h:50
void WriteU64LE(Uint64 value)
Use this function to write 64 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:3087
constexpr IOStatus IO_STATUS_READY
Everything is ready (no errors and not EOF).
Definition: SDL3pp_iostream.h:39
constexpr IOStatus IO_STATUS_NOT_READY
Non blocking I/O, not ready.
Definition: SDL3pp_iostream.h:47
static IOStream FromFile(StringParam file, StringParam mode)
Use this function to create a new IOStream structure for reading from and/or writing to a named file.
Definition: SDL3pp_iostream.h:1771
void CloseIO(IOStreamRaw context)
Close and free an allocated IOStream structure.
Definition: SDL3pp_iostream.h:2011
void WriteS64LE(Sint64 value)
Use this function to write 64 bits in native format to an IOStream as little-endian data.
Definition: SDL3pp_iostream.h:3112
Sint16 ReadS16LE()
Use this function to read 16 bits of little-endian data from an IOStream and return in native format.
Definition: SDL3pp_iostream.h:2539
IOStatus GetStatus() const
Query the stream status of an IOStream.
Definition: SDL3pp_iostream.h:2059
static IOStream FromMem(TargetBytes mem)
Use this function to prepare a read-write memory buffer for use with IOStream.
Definition: SDL3pp_iostream.h:1856
constexpr IOWhence IO_SEEK_SET
Seek from the beginning of data.
Definition: SDL3pp_iostream.h:66
constexpr IOWhence IO_SEEK_END
Seek relative to the end of data.
Definition: SDL3pp_iostream.h:72
PropertiesRef GetProperties() const
Get the properties associated with an IOStream.
Definition: SDL3pp_iostream.h:2031
::Uint32 Uint32
An unsigned 32-bit integer type.
Definition: SDL3pp_stdinc.h:280
::Uint64 Uint64
An unsigned 64-bit integer type.
Definition: SDL3pp_stdinc.h:310
::Uint8 Uint8
An unsigned 8-bit integer type.
Definition: SDL3pp_stdinc.h:228
::Sint8 Sint8
A signed 8-bit integer type.
Definition: SDL3pp_stdinc.h:215
::Sint64 Sint64
A signed 64-bit integer type.
Definition: SDL3pp_stdinc.h:295
::Sint32 Sint32
A signed 32-bit integer type.
Definition: SDL3pp_stdinc.h:267
::Sint16 Sint16
A signed 16-bit integer type.
Definition: SDL3pp_stdinc.h:241
::Uint16 Uint16
An unsigned 16-bit integer type.
Definition: SDL3pp_stdinc.h:254
Main include header for the SDL3pp library.
Reference for IOStream.
Definition: SDL3pp_iostream.h:1631
constexpr IOStreamRef(const IOStreamRef &other) noexcept
Copy constructor.
Definition: SDL3pp_iostream.h:1659
IOStreamRef(IOStreamRaw resource) noexcept
Constructs from raw IOStream.
Definition: SDL3pp_iostream.h:1641
constexpr IOStreamRef(IOStreamRef &&other) noexcept
Move constructor.
Definition: SDL3pp_iostream.h:1665
~IOStreamRef()
Destructor.
Definition: SDL3pp_iostream.h:1671
constexpr IOStreamRef(const IOStream &resource) noexcept
Constructs from IOStream.
Definition: SDL3pp_iostream.h:1653
constexpr IOStreamRef & operator=(IOStreamRef other) noexcept
Assignment operator.
Definition: SDL3pp_iostream.h:1674
Reference for Properties.
Definition: SDL3pp_properties.h:690
A simple std::string-like interface for SDL allocated strings.
Definition: SDL3pp_strings.h:153