diff options
author | Alex Zolotarev <deathbaba@gmail.com> | 2010-12-05 19:24:16 +0300 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-22 22:33:57 +0300 |
commit | d6e12b7ce4bcbf0ccd1c07eb25de143422913c34 (patch) | |
tree | a7e910c330ce4da9b4f2d8be76067adece2561c4 /coding/byte_stream.hpp |
One Month In Minsk. Made in Belarus.
Diffstat (limited to 'coding/byte_stream.hpp')
-rw-r--r-- | coding/byte_stream.hpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/coding/byte_stream.hpp b/coding/byte_stream.hpp new file mode 100644 index 0000000000..e006ced5ef --- /dev/null +++ b/coding/byte_stream.hpp @@ -0,0 +1,60 @@ +#pragma once +#include "../base/base.hpp" +#include "../std/vector.hpp" +#include "../std/memcpy.hpp" +#include "../base/start_mem_debug.hpp" + +class ArrayByteSource +{ +public: + explicit ArrayByteSource(const void * p) : m_p(static_cast<const unsigned char *>(p)) {} + + unsigned char ReadByte() + { + return *m_p++; + } + + void Read(void * ptr, size_t size) + { + memcpy(ptr, m_p, size); + m_p += size; + } + + const void * Ptr() const { + return m_p; + } + + void Advance(size_t size) + { + m_p += size; + } +private: + const unsigned char * m_p; +}; + +// TODO: Separate sink and rich write interface. +template <class TStorage = vector<unsigned char> > class PushBackByteSink +{ +public: + explicit PushBackByteSink(TStorage & storage) + : m_Storage(storage), m_InitialStorageSize(storage.size()) + { + } + + void Write(void const * p, size_t size) + { + m_Storage.insert(m_Storage.end(), + static_cast<unsigned char const *>(p), + static_cast<unsigned char const *>(p) + size); + } + + size_t BytesWritten() const + { + return m_Storage.size() - m_InitialStorageSize; + } +private: + TStorage & m_Storage; + size_t m_InitialStorageSize; +}; + +#include "../base/stop_mem_debug.hpp" |