/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: BlobReader.hpp Date: 2021-6-10 Author: Reece ***/ #pragma once namespace Aurora::IO::Buffered { struct BlobReader : IStreamReader { AU_COPY_MOVE(BlobReader) inline BlobReader(const AuSPtr &buffer) : pBuffer_(buffer) {} inline BlobReader(Memory::ByteBuffer &&buffer) : pBuffer_(AuMakeShared(buffer)) {} inline BlobReader(const Memory::ByteBuffer &buffer) : pBuffer_(AuMakeShared(buffer)) {} inline BlobReader() : pBuffer_(AuMakeShared()) {} inline virtual EStreamError IsOpen() override { auto pBuffer = this->pBuffer_; if (!pBuffer) { return EStreamError::eErrorStreamNotOpen; } if (pBuffer->HasStreamError()) { return EStreamError::eErrorByteBuffer; } return EStreamError::eErrorNone; } inline virtual EStreamError Read(const Memory::MemoryViewStreamWrite ¶meters) override { auto pBuffer = this->pBuffer_; if (!pBuffer) { return EStreamError::eErrorStreamNotOpen; } if (pBuffer->HasStreamError()) { return EStreamError::eErrorByteBuffer; } parameters.outVariable = pBuffer->Read(parameters.ptr, parameters.length); return parameters.outVariable == 0 ? EStreamError::eErrorEndOfStream : EStreamError::eErrorNone; } inline virtual void Close() override { AuResetMember(this->pBuffer_); } protected: AuSPtr pBuffer_; }; }