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