/*** 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) inline ViewReader(const AuSPtr &view) : pView_(view) { } inline ViewReader() { } inline ~ViewReader() { } inline virtual EStreamError IsOpen() override { if (!this->pView_) { return EStreamError::eErrorStreamNotOpen; } if (!(*this->pView_.get())) { return EStreamError::eErrorStreamNotOpen; } return EStreamError::eErrorNone; } inline virtual EStreamError Read(const Memory::MemoryViewStreamWrite ¶meters) override { parameters.outVariable = 0; if (!this->pView_) { return EStreamError::eErrorStreamNotOpen; } if (!(*this->pView_.get())) { this->pView_.reset(); return this->uOffset_ ? EStreamError::eErrorStreamNotOpen : EStreamError::eErrorNone; } auto uToRead = AuMin(this->pView_->length - this->uOffset_, parameters.length); parameters.outVariable = uToRead; AuMemcpy(parameters.ptr, this->pView_->Begin() + this->uOffset_, uToRead); this->uOffset_ += uToRead; return parameters.outVariable == 0 ? EStreamError::eErrorEndOfStream : EStreamError::eErrorNone; } inline virtual void Close() override { this->pView_.reset(); } inline AuUInt &GetOffset() { return this->uOffset_; } inline const AuUInt &GetOffset() const { return this->uOffset_; } private: AuSPtr pView_; AuUInt uOffset_ {}; }; }