diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2019-01-14 01:13:55 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2019-01-14 01:13:55 +0000 |
| commit | 4eb6fa4b66ec4698843b950812833785da1aed2e (patch) | |
| tree | eddf54e77ca13f38547488f534ea468bb2b3b837 /Common/src | |
| parent | Fixed bug in File2Include utility not handling lines without \n at the end (diff) | |
| download | DiligentCore-4eb6fa4b66ec4698843b950812833785da1aed2e.tar.gz DiligentCore-4eb6fa4b66ec4698843b950812833785da1aed2e.zip | |
Added MemoryFileStream
Diffstat (limited to 'Common/src')
| -rw-r--r-- | Common/src/BasicFileStream.cpp | 14 | ||||
| -rw-r--r-- | Common/src/MemoryFileStream.cpp | 80 |
2 files changed, 87 insertions, 7 deletions
diff --git a/Common/src/BasicFileStream.cpp b/Common/src/BasicFileStream.cpp index 643e0e1b..34f9a6b5 100644 --- a/Common/src/BasicFileStream.cpp +++ b/Common/src/BasicFileStream.cpp @@ -26,9 +26,9 @@ namespace Diligent { - BasicFileStream::BasicFileStream(IReferenceCounters *pRefCounters, - const Diligent::Char *Path, - EFileAccessMode Access/* = EFileAccessMode::Read*/) : + BasicFileStream::BasicFileStream(IReferenceCounters* pRefCounters, + const Char* Path, + EFileAccessMode Access/* = EFileAccessMode::Read*/) : TBase(pRefCounters), m_FileWrpr(Path, Access) { @@ -36,17 +36,17 @@ namespace Diligent IMPLEMENT_QUERY_INTERFACE(BasicFileStream, IID_FileStream, TBase) - bool BasicFileStream::Read(void *Data, size_t BufferSize) + bool BasicFileStream::Read(void* Data, size_t Size) { - return m_FileWrpr->Read( Data, BufferSize ); + return m_FileWrpr->Read( Data, Size ); } - void BasicFileStream::Read( Diligent::IDataBlob *pData ) + void BasicFileStream::Read( Diligent::IDataBlob* pData ) { return m_FileWrpr->Read( pData ); } - bool BasicFileStream::Write(const void *Data, size_t Size) + bool BasicFileStream::Write(const void* Data, size_t Size) { return m_FileWrpr->Write( Data, Size ); } diff --git a/Common/src/MemoryFileStream.cpp b/Common/src/MemoryFileStream.cpp new file mode 100644 index 00000000..cae9c6ce --- /dev/null +++ b/Common/src/MemoryFileStream.cpp @@ -0,0 +1,80 @@ +/* Copyright 2015-2019 Egor Yusov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF ANY PROPRIETARY RIGHTS. + * + * In no event and under no legal theory, whether in tort (including negligence), + * contract, or otherwise, unless required by applicable law (such as deliberate + * and grossly negligent acts) or agreed to in writing, shall any Contributor be + * liable for any damages, including any direct, indirect, special, incidental, + * or consequential damages of any character arising as a result of this License or + * out of the use or inability to use the software (including but not limited to damages + * for loss of goodwill, work stoppage, computer failure or malfunction, or any and + * all other commercial damages or losses), even if such Contributor has been advised + * of the possibility of such damages. + */ + +#include <algorithm> +#include "pch.h" + +#include "MemoryFileStream.h" + +namespace Diligent +{ + MemoryFileStream::MemoryFileStream(IReferenceCounters* pRefCounters, + IDataBlob* pData) : + TBase(pRefCounters), + m_DataBlob(pData) + { + } + + IMPLEMENT_QUERY_INTERFACE(MemoryFileStream, IID_FileStream, TBase) + + bool MemoryFileStream::Read(void* Data, size_t Size) + { + VERIFY_EXPR(m_CurrentOffset <= m_DataBlob->GetSize()); + auto BytesLeft = m_DataBlob->GetSize() - m_CurrentOffset; + auto BytesToRead = std::min(BytesLeft, Size); + auto* pSrcData = reinterpret_cast<const Uint8*>(m_DataBlob->GetDataPtr()) + m_CurrentOffset; + memcpy(Data, pSrcData, BytesToRead); + m_CurrentOffset += BytesToRead; + return Size == BytesToRead; + } + + void MemoryFileStream::Read( IDataBlob* pData ) + { + auto BytesLeft = m_DataBlob->GetSize() - m_CurrentOffset; + pData->Resize(BytesLeft); + auto res = Read(pData->GetDataPtr(), pData->GetSize()); + VERIFY_EXPR(res); (void)res; + } + + bool MemoryFileStream::Write(const void* Data, size_t Size) + { + if (m_CurrentOffset + Size > m_DataBlob->GetSize()) + { + m_DataBlob->Resize(m_CurrentOffset + Size); + } + auto* DstData = reinterpret_cast<Uint8*>(m_DataBlob->GetDataPtr()) + m_CurrentOffset; + memcpy(DstData, Data, Size); + m_CurrentOffset += Size; + return true; + } + + bool MemoryFileStream::IsValid() + { + return !!m_DataBlob; + } + + size_t MemoryFileStream::GetSize() + { + return m_DataBlob->GetSize(); + } +} |
