wut/include/nn/sl/IStream.h
GaryOderNichts 2c98cc91aa
Some checks failed
C/C++ CI / ubuntu-latest (push) Has been cancelled
Run clang-format
`find . -regex '.*\.\(cpp\|hpp\|cu\|cuh\|c\|h\)' -exec clang-format -style=file -i {} \;`
2025-06-05 11:06:04 +01:00

89 lines
1.9 KiB
C++

#pragma once
#include <wut.h>
#include <nn/result.h>
#include <nn/sl/details/IStreamDetails.h>
#include <nn/sl/sl_cpp.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