/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: ViewReader.hpp Date: 2022-12-11 Author: Reece ***/ #pragma once namespace Aurora::IO::Buffered { struct ViewReader : IStreamReader { AU_NO_COPY(ViewReader) AU_MOVE(ViewReader) inline ViewReader(const AuSPtr &pView) : view_(pView ? *pView.get() : Memory::MemoryViewRead {}), pHold(pView) { } inline ViewReader(const Memory::MemoryViewRead &view, AuSPtr pBlock) : view_(view), pHold(pBlock) { } inline ViewReader() { } inline ~ViewReader() { } inline virtual EStreamError IsOpen() override { if (!this->view_) { return EStreamError::eErrorStreamNotOpen; } if (!this->pHold) { return EStreamError::eErrorStreamNotOpen; } return EStreamError::eErrorNone; } inline virtual EStreamError Read(const Memory::MemoryViewStreamWrite ¶meters) override { parameters.outVariable = 0; if (!this->view_) { return EStreamError::eErrorStreamNotOpen; } if (!this->pHold) { this->Close(); return this->uOffset_ ? EStreamError::eErrorStreamNotOpen : EStreamError::eErrorNone; } auto uToRead = AuMin(this->view_.length - this->uOffset_, parameters.length); parameters.outVariable = uToRead; AuMemcpy(parameters.ptr, this->view_.Begin() + this->uOffset_, uToRead); this->uOffset_ += uToRead; return parameters.outVariable == 0 ? EStreamError::eErrorEndOfStream : EStreamError::eErrorNone; } inline virtual void Close() override { AuResetMember(this->pHold); AuResetMember(this->view_); } inline AuUInt &GetOffset() { return this->uOffset_; } inline const AuUInt &GetOffset() const { return this->uOffset_; } private: Memory::MemoryViewRead view_; AuSPtr pHold; AuUInt uOffset_ {}; }; }