diff --git a/include/Nazara/Core.hpp b/include/Nazara/Core.hpp index 2e83b252d..7f16775d8 100644 --- a/include/Nazara/Core.hpp +++ b/include/Nazara/Core.hpp @@ -57,6 +57,7 @@ #include #include #include +#include #include #include #include diff --git a/include/Nazara/Core/InputStream.hpp b/include/Nazara/Core/InputStream.hpp index ec67be839..9bd66f91b 100644 --- a/include/Nazara/Core/InputStream.hpp +++ b/include/Nazara/Core/InputStream.hpp @@ -12,7 +12,7 @@ namespace Nz { - class NAZARA_CORE_API InputStream : public virtual Stream + class NAZARA_CORE_API InputStream : virtual public Stream { public: virtual ~InputStream(); diff --git a/include/Nazara/Core/MemoryStream.hpp b/include/Nazara/Core/MemoryStream.hpp index a6cf6ea70..30c2fa58a 100644 --- a/include/Nazara/Core/MemoryStream.hpp +++ b/include/Nazara/Core/MemoryStream.hpp @@ -9,33 +9,38 @@ #include #include +#include +#include namespace Nz { - class NAZARA_CORE_API MemoryStream : public InputStream + class NAZARA_CORE_API MemoryStream : public InputStream, public OutputStream { public: - MemoryStream(const void* ptr, UInt64 size); - MemoryStream(const MemoryStream&) = delete; - MemoryStream(MemoryStream&&) = delete; ///TODO - ~MemoryStream(); + MemoryStream(const void* ptr, unsigned int size); + MemoryStream(const MemoryStream&) = default; + MemoryStream(MemoryStream&&) = default; + ~MemoryStream() = default; - bool EndOfStream() const; + bool EndOfStream() const override; - UInt64 GetCursorPos() const; - UInt64 GetSize() const; + void Flush() override; - std::size_t Read(void* buffer, std::size_t size); + UInt64 GetCursorPos() const override; + UInt64 GetSize() const override; - bool SetCursorPos(UInt64 offset); + std::size_t Read(void* buffer, std::size_t size) override; - MemoryStream& operator=(const MemoryStream&) = delete; - MemoryStream& operator=(MemoryStream&&) = delete; ///TODO + bool SetCursorPos(UInt64 offset) override; + + std::size_t Write(const void* buffer, std::size_t size) override; + + MemoryStream& operator=(const MemoryStream&) = default; + MemoryStream& operator=(MemoryStream&&) = default; private: - const UInt8* m_ptr; + std::vector m_buffer; UInt64 m_pos; - UInt64 m_size; }; } diff --git a/include/Nazara/Core/MemoryView.hpp b/include/Nazara/Core/MemoryView.hpp new file mode 100644 index 000000000..47fdc87f0 --- /dev/null +++ b/include/Nazara/Core/MemoryView.hpp @@ -0,0 +1,42 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#pragma once + +#ifndef NAZARA_MEMORYVIEW_HPP +#define NAZARA_MEMORYVIEW_HPP + +#include +#include + +namespace Nz +{ + class NAZARA_CORE_API MemoryView : public InputStream + { + public: + MemoryView(const void* ptr, UInt64 size); + MemoryView(const MemoryView&) = delete; + MemoryView(MemoryView&&) = delete; ///TODO + ~MemoryView() = default; + + bool EndOfStream() const override; + + UInt64 GetCursorPos() const override; + UInt64 GetSize() const override; + + std::size_t Read(void* buffer, std::size_t size) override; + + bool SetCursorPos(UInt64 offset) override; + + MemoryView& operator=(const MemoryView&) = delete; + MemoryView& operator=(MemoryView&&) = delete; ///TODO + + private: + const UInt8* m_ptr; + UInt64 m_pos; + UInt64 m_size; + }; +} + +#endif // NAZARA_MEMORYVIEW_HPP diff --git a/include/Nazara/Core/OutputStream.hpp b/include/Nazara/Core/OutputStream.hpp index 363270ea5..2f475d4b4 100644 --- a/include/Nazara/Core/OutputStream.hpp +++ b/include/Nazara/Core/OutputStream.hpp @@ -12,7 +12,7 @@ namespace Nz { - class NAZARA_CORE_API OutputStream : public virtual Stream + class NAZARA_CORE_API OutputStream : virtual public Stream { public: virtual ~OutputStream(); diff --git a/include/Nazara/Core/ResourceLoader.inl b/include/Nazara/Core/ResourceLoader.inl index fd4b9d4e3..3f78ca7ff 100644 --- a/include/Nazara/Core/ResourceLoader.inl +++ b/include/Nazara/Core/ResourceLoader.inl @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include namespace Nz @@ -139,7 +139,7 @@ namespace Nz } #endif - MemoryStream stream(data, size); + MemoryView stream(data, size); bool found = false; for (Loader& loader : Type::s_loaders) diff --git a/src/Nazara/Audio/Formats/sndfileLoader.cpp b/src/Nazara/Audio/Formats/sndfileLoader.cpp index 14f932e9e..fb8725a37 100644 --- a/src/Nazara/Audio/Formats/sndfileLoader.cpp +++ b/src/Nazara/Audio/Formats/sndfileLoader.cpp @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include @@ -124,7 +124,7 @@ namespace Nz bool Open(const void* data, std::size_t size, bool forceMono) { - m_ownedStream.reset(new MemoryStream(data, size)); + m_ownedStream.reset(new MemoryView(data, size)); return Open(*m_ownedStream, forceMono); } diff --git a/src/Nazara/Core/Log.cpp b/src/Nazara/Core/Log.cpp index 4c8997718..af9f9ef14 100644 --- a/src/Nazara/Core/Log.cpp +++ b/src/Nazara/Core/Log.cpp @@ -161,5 +161,5 @@ namespace Nz { static Log log; return &log; -} + } } diff --git a/src/Nazara/Core/MemoryStream.cpp b/src/Nazara/Core/MemoryStream.cpp index 3c07d1fee..99aa04b26 100644 --- a/src/Nazara/Core/MemoryStream.cpp +++ b/src/Nazara/Core/MemoryStream.cpp @@ -9,21 +9,22 @@ namespace Nz { - MemoryStream::MemoryStream(const void* ptr, UInt64 size) : - Stream(OpenMode_ReadOnly), - m_ptr(reinterpret_cast(ptr)), - m_pos(0), - m_size(size) - { - } - - MemoryStream::~MemoryStream() + MemoryStream::MemoryStream(const void* ptr, unsigned int size) : + Stream(OpenMode_ReadWrite), + m_pos(0) { + m_buffer.resize(size); + std::memcpy(m_buffer.data(), ptr, size); } bool MemoryStream::EndOfStream() const { - return m_pos == m_size; + return m_pos >= m_buffer.size(); + } + + void MemoryStream::Flush() + { + // Nothing to flush } UInt64 MemoryStream::GetCursorPos() const @@ -33,25 +34,36 @@ namespace Nz UInt64 MemoryStream::GetSize() const { - return m_size; + return m_buffer.size(); } std::size_t MemoryStream::Read(void* buffer, std::size_t size) { - unsigned int readSize = std::min(static_cast(size), static_cast(m_size-m_pos)); + std::size_t readSize = std::min(size, static_cast(m_buffer.size() - m_pos)); if (buffer) - std::memcpy(buffer, &m_ptr[m_pos], readSize); + std::memcpy(buffer, m_buffer.data() + m_pos, readSize); m_pos += readSize; - return readSize; } bool MemoryStream::SetCursorPos(UInt64 offset) { - m_pos = std::min(offset, m_size); + m_pos = std::min(offset, m_buffer.size()); return true; } + + std::size_t MemoryStream::Write(const void* buffer, std::size_t size) + { + std::size_t endPos = static_cast(m_pos + size); + if (endPos > m_buffer.size()) + m_buffer.resize(endPos); + + std::memcpy(m_buffer.data(), buffer, size); + + m_pos = endPos; + return size; + } } diff --git a/src/Nazara/Core/MemoryView.cpp b/src/Nazara/Core/MemoryView.cpp new file mode 100644 index 000000000..b5a47c776 --- /dev/null +++ b/src/Nazara/Core/MemoryView.cpp @@ -0,0 +1,52 @@ +// Copyright (C) 2015 Jérôme Leclercq +// This file is part of the "Nazara Engine - Core module" +// For conditions of distribution and use, see copyright notice in Config.hpp + +#include +#include +#include +#include + +namespace Nz +{ + MemoryView::MemoryView(const void* ptr, UInt64 size) : + Stream(OpenMode_ReadOnly), + m_ptr(reinterpret_cast(ptr)), + m_pos(0), + m_size(size) + { + } + + bool MemoryView::EndOfStream() const + { + return m_pos >= m_size; + } + + UInt64 MemoryView::GetCursorPos() const + { + return m_pos; + } + + UInt64 MemoryView::GetSize() const + { + return m_size; + } + + std::size_t MemoryView::Read(void* buffer, std::size_t size) + { + std::size_t readSize = std::min(size, static_cast(m_size - m_pos)); + + if (buffer) + std::memcpy(buffer, &m_ptr[m_pos], readSize); + + m_pos += readSize; + return readSize; + } + + bool MemoryView::SetCursorPos(UInt64 offset) + { + m_pos = std::min(offset, m_size); + + return true; + } +} diff --git a/src/Nazara/Lua/LuaInstance.cpp b/src/Nazara/Lua/LuaInstance.cpp index 7b1e603b2..d5b8e3e1d 100644 --- a/src/Nazara/Lua/LuaInstance.cpp +++ b/src/Nazara/Lua/LuaInstance.cpp @@ -10,7 +10,7 @@ #include #include #include -#include +#include #include #include #include @@ -418,7 +418,7 @@ namespace Nz bool LuaInstance::ExecuteFromMemory(const void* data, unsigned int size) { - MemoryStream stream(data, size); + MemoryView stream(data, size); return ExecuteFromStream(stream); } diff --git a/src/Nazara/Utility/Formats/FreeTypeLoader.cpp b/src/Nazara/Utility/Formats/FreeTypeLoader.cpp index 23cdc58be..f859e327f 100644 --- a/src/Nazara/Utility/Formats/FreeTypeLoader.cpp +++ b/src/Nazara/Utility/Formats/FreeTypeLoader.cpp @@ -9,7 +9,7 @@ #include FT_OUTLINE_H #include #include -#include +#include #include #include #include @@ -294,7 +294,7 @@ namespace Nz void SetMemory(const void* data, std::size_t size) { - m_ownedStream.reset(new MemoryStream(data, size)); + m_ownedStream.reset(new MemoryView(data, size)); SetStream(*m_ownedStream); } diff --git a/src/Nazara/Utility/Formats/STBLoader.cpp b/src/Nazara/Utility/Formats/STBLoader.cpp index ca6832f55..86d23644e 100644 --- a/src/Nazara/Utility/Formats/STBLoader.cpp +++ b/src/Nazara/Utility/Formats/STBLoader.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include