mirror of
https://github.com/devkitPro/wut.git
synced 2026-08-05 09:20:21 -05:00
69 lines
2.1 KiB
C++
69 lines
2.1 KiB
C++
#pragma once
|
|
|
|
#include <nn/result.h>
|
|
#include <nn/sl/details/IStreamDetails.h>
|
|
#include <nn/sl/sl_cpp.h>
|
|
#include <wut.h>
|
|
|
|
#ifdef __cplusplus
|
|
|
|
namespace nn::sl {
|
|
class IStream : public details::IStreamBase {
|
|
|
|
public:
|
|
IStream() {
|
|
InitInternalVtable();
|
|
}
|
|
|
|
IStream(IStream &src) {
|
|
InitInternalVtable();
|
|
}
|
|
|
|
IStream &operator=(const IStream &other) {
|
|
InitInternalVtable();
|
|
return *this;
|
|
}
|
|
|
|
IStream &operator=(IStream &&src) noexcept {
|
|
InitInternalVtable();
|
|
return *this;
|
|
}
|
|
|
|
~IStream() override = default;
|
|
|
|
private:
|
|
static nn::Result ReadWrapper(details::IStreamInternal *instance, uint32_t *bytesRead, void *buffer, uint32_t readSize) {
|
|
return instance->vtable->instance->Read(bytesRead, buffer, readSize);
|
|
}
|
|
|
|
static nn::Result WriteWrapper(details::IStreamInternal *instance, uint32_t *bytesWritten, void *buffer, uint32_t readSize) {
|
|
return instance->vtable->instance->Write(bytesWritten, buffer, readSize);
|
|
}
|
|
|
|
static nn::Result GetSizeWrapper(details::IStreamInternal *instance, uint32_t *fileSize) {
|
|
return instance->vtable->instance->GetSize(fileSize);
|
|
}
|
|
|
|
static nn::Result SeekWrapper(details::IStreamInternal *instance, int32_t offset, nn::sl::SeekOrigin seekOrigin) {
|
|
return instance->vtable->instance->Seek(offset, seekOrigin);
|
|
}
|
|
|
|
details::IStreamInternal *GetInternal() override {
|
|
return &mInstance;
|
|
}
|
|
|
|
void InitInternalVtable() {
|
|
mVTable = {.instance = this,
|
|
.ReadFn = &ReadWrapper,
|
|
.WriteFn = &WriteWrapper,
|
|
.GetSizeFn = &GetSizeWrapper,
|
|
.SeekFn = &SeekWrapper};
|
|
mInstance.vtable = &mVTable;
|
|
}
|
|
|
|
details::IStreamInternal mInstance{};
|
|
details::IStreamInternalVTable mVTable{};
|
|
};
|
|
} // namespace nn::sl
|
|
|
|
#endif |