/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuIngestableReadBase.inl Date: 2022-2-14 Author: Reece ***/ #pragma once namespace Aurora::Compression { template void IngestableReadBase::SetArray(T(&array)[Z]) { this->internalInBuffer_ = AuReinterpretCast(array); this->internalInLength_ = Z; } void IngestableReadBase::SetPointer(void *pHead, AuUInt32 dwLength) { this->internalInBuffer_ = AuReinterpretCast(pHead); this->internalInLength_ = dwLength; } // Given a zlib-like interface input paremeters, a stream source, and a buffer... // // ...reads template AuUInt32 IngestableReadBase::IngestForInPointer(const AuSPtr &reader, T *&in, Z &inAlreadyAvailable, AuUInt32 dwAmount) { if (inAlreadyAvailable > this->internalInLength_) { SysPanic("Invalid Buffer Position"); } AuUInt32 dwCurrentOffset {}; if (in && inAlreadyAvailable) { dwCurrentOffset = AuReinterpretCast(in) - this->internalInBuffer_; } dwCurrentOffset += inAlreadyAvailable; AuUInt32 dwCurrentLength = this->internalInLength_ - dwCurrentOffset; if (dwCurrentLength > this->internalInLength_) { SysPanic("Invalid Buffer Position"); } auto nextStreamRead = this->internalInBuffer_ + dwCurrentOffset; auto nextStreamSegment = this->internalInBuffer_ + inAlreadyAvailable; AuUInt uRead = AuMin(dwAmount, dwCurrentLength); if (reader->Read(AuMemoryViewStreamWrite(this->internalInBuffer_ + dwCurrentOffset, uRead)) != IO::EStreamError::eErrorNone) { return 0; } in = (T *)(this->internalInBuffer_ + dwCurrentOffset); inAlreadyAvailable += uRead; return uRead; } }