From 0166518132d66b48450dbc5265bc3e155967302f Mon Sep 17 00:00:00 2001 From: Alexander Gessler Date: Tue, 22 Jul 2014 20:36:16 +0200 Subject: [PATCH] Extend StreamWriter to write to a buffer and to allow re-positioning of the write cursor within the buffer. --- code/StreamWriter.h | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/code/StreamWriter.h b/code/StreamWriter.h index d4e5e99ac..e35953c72 100644 --- a/code/StreamWriter.h +++ b/code/StreamWriter.h @@ -60,10 +60,9 @@ namespace Assimp { template class StreamWriter { -public: - - typedef std::size_t diff; - typedef std::size_t pos; + enum { + INITIAL_CAPACITY = 1024 + }; public: @@ -83,7 +82,7 @@ public: , le(le) { ai_assert(stream); - InternBegin(); + buffer.reserve(INITIAL_CAPACITY); } // --------------------------------------------------------------------- @@ -92,12 +91,13 @@ public: , le(le) { ai_assert(stream); - InternBegin(); + buffer.reserve(INITIAL_CAPACITY); } // --------------------------------------------------------------------- ~StreamWriter() { - delete[] buffer; + stream->Write(&buffer[0], 1, buffer.size()); + stream->Flush(); } public: @@ -173,6 +173,16 @@ public: return *this; } + // --------------------------------------------------------------------- + std::size_t GetCurrentPos() const { + return cursor; + } + + // --------------------------------------------------------------------- + void SetCurrentPos(std::size_t new_cursor) { + cursor = new_cursor; + } + private: // --------------------------------------------------------------------- @@ -180,13 +190,27 @@ private: template void Put(T f) { Intern :: Getter() (&f, le); - stream->Write(&f, sizeof(T), 1); + + if (cursor + sizeof(T) >= buffer.size()) { + buffer.resize(cursor + sizeof(T)); + } + + void* dest = &buffer[cursor]; + + // reinterpret_cast + assignment breaks strict aliasing rules + // and generally causes trouble on platforms such as ARM that + // do not silently ignore alignment faults. + ::memcpy(dest, &f, sizeof(T)); + cursor += sizeof(T); } private: boost::shared_ptr stream; bool le; + + std::vector buffer; + std::size_t cursor; };