/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: StringToProvider.cpp Date: 2022-1-31 Author: Reece ***/ #include #include "StringToProvider.hpp" namespace Aurora::IO::Character { struct CharacterProvider : ICharacterProviderEx { CharacterProvider(const AuROString &in, AuUInt offset = 0); CharacterProvider(const AuSPtr &in, AuUInt offset = 0); bool GetByte(AuUInt8 &val) override; AuUInt GetPosition() override; bool SetPosition(AuUInt offset) override; bool HasString(); protected: AuUInt uOffset_ {}; AuSPtr pString_; }; CharacterProvider::CharacterProvider(const AuROString &in, AuUInt offset) : pString_(AuMakeShared(in)), uOffset_(offset) {} CharacterProvider::CharacterProvider(const AuSPtr &in, AuUInt offset) : pString_(in), uOffset_(offset) {} bool CharacterProvider::GetByte(AuUInt8 &val) { auto offset = this->uOffset_++; if (offset >= this->pString_->size()) { offset = this->pString_->size(); return false; } val = this->pString_->at(offset); return true; } AuUInt CharacterProvider::GetPosition() { return this->uOffset_; } bool CharacterProvider::SetPosition(AuUInt offset) { this->uOffset_ = offset; return this->uOffset_ < this->pString_->size(); } bool CharacterProvider::HasString() { return this->pString_; } AUKN_SYM ICharacterProviderEx *ProviderFromSharedStringNew(const AuSPtr &str, AuUInt index) { SysCheckArgNotNull(str, {}); return _new CharacterProvider(str, index); } AUKN_SYM void ProviderFromSharedStringRelease(ICharacterProviderEx *me) { AuSafeDelete(me); } AUKN_SYM ICharacterProviderEx *ProviderFromStringNew(const AuROString &str, AuUInt index) { if (auto pRet = _new CharacterProvider(str, index)) { if (pRet->HasString()) { return pRet; } } return nullptr; } AUKN_SYM void ProviderFromStringRelease(ICharacterProviderEx *me) { AuSafeDelete(me); } }