Extend StreamWriter to write to a buffer and to allow re-positioning of the write cursor within the buffer.

pull/317/head
Alexander Gessler 2014-07-22 20:36:16 +02:00
parent cc32eda226
commit 0166518132
1 changed files with 32 additions and 8 deletions

View File

@ -60,10 +60,9 @@ namespace Assimp {
template <bool SwapEndianess = false, bool RuntimeSwitch = false> template <bool SwapEndianess = false, bool RuntimeSwitch = false>
class StreamWriter class StreamWriter
{ {
public: enum {
INITIAL_CAPACITY = 1024
typedef std::size_t diff; };
typedef std::size_t pos;
public: public:
@ -83,7 +82,7 @@ public:
, le(le) , le(le)
{ {
ai_assert(stream); ai_assert(stream);
InternBegin(); buffer.reserve(INITIAL_CAPACITY);
} }
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@ -92,12 +91,13 @@ public:
, le(le) , le(le)
{ {
ai_assert(stream); ai_assert(stream);
InternBegin(); buffer.reserve(INITIAL_CAPACITY);
} }
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
~StreamWriter() { ~StreamWriter() {
delete[] buffer; stream->Write(&buffer[0], 1, buffer.size());
stream->Flush();
} }
public: public:
@ -173,6 +173,16 @@ public:
return *this; return *this;
} }
// ---------------------------------------------------------------------
std::size_t GetCurrentPos() const {
return cursor;
}
// ---------------------------------------------------------------------
void SetCurrentPos(std::size_t new_cursor) {
cursor = new_cursor;
}
private: private:
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@ -180,13 +190,27 @@ private:
template <typename T> template <typename T>
void Put(T f) { void Put(T f) {
Intern :: Getter<SwapEndianess,T,RuntimeSwitch>() (&f, le); Intern :: Getter<SwapEndianess,T,RuntimeSwitch>() (&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: private:
boost::shared_ptr<IOStream> stream; boost::shared_ptr<IOStream> stream;
bool le; bool le;
std::vector<uint8_t> buffer;
std::size_t cursor;
}; };