diff options
author | John Hodge <tpg@mutabah.net> | 2016-10-19 11:10:13 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-10-19 11:10:13 +0800 |
commit | e2851874b4d3e8dcd3a65e52ef7de11b1d4db1c1 (patch) | |
tree | df6bcf99468aee7b986da838d0c3a308458e4bc7 /src | |
parent | 5f8a9437fbbf78d966aa5811424d12d62d8b65a6 (diff) | |
download | mrust-e2851874b4d3e8dcd3a65e52ef7de11b1d4db1c1.tar.gz |
HIR Deserialise - Add a 1KB buffer to the front
Diffstat (limited to 'src')
-rw-r--r-- | src/hir/serialise_lowlevel.cpp | 43 | ||||
-rw-r--r-- | src/hir/serialise_lowlevel.hpp | 3 |
2 files changed, 42 insertions, 4 deletions
diff --git a/src/hir/serialise_lowlevel.cpp b/src/hir/serialise_lowlevel.cpp index a8f69eb2..1678b114 100644 --- a/src/hir/serialise_lowlevel.cpp +++ b/src/hir/serialise_lowlevel.cpp @@ -22,16 +22,51 @@ void ::HIR::serialise::Writer::write(const void* buf, size_t len) ::HIR::serialise::Reader::Reader(const ::std::string& filename): - m_backing( filename ) + m_backing( filename ), + m_buffer(), + m_buffer_ofs(0) { + m_buffer.reserve(1024); m_is.push( ::boost::iostreams::zlib_decompressor() ); m_is.push( m_backing ); } void ::HIR::serialise::Reader::read(void* buf, size_t len) { - m_is.read(reinterpret_cast<char*>(buf), len); - if( !m_is ) { - throw ""; + size_t rem = m_buffer.size() - m_buffer_ofs; + if( m_buffer_ofs < m_buffer.size() ) { + if( len <= rem ) { + memcpy(buf, m_buffer.data() + m_buffer_ofs, len); + m_buffer_ofs += len; + return ; + } + else { + memcpy(buf, m_buffer.data() + m_buffer_ofs, rem); + m_buffer_ofs += rem; + len -= rem; + } + } + // m_bufer_ofs == m_buffer.size() + + if( len >= m_buffer.capacity() ) + { + // If the new read is longer than the buffer size, skip the buffer. + m_is.read(reinterpret_cast<char*>(buf), len); + } + else + { + m_buffer.resize( m_buffer.capacity(), 0 ); + m_buffer_ofs = 0; + m_is.read(reinterpret_cast<char*>(m_buffer.data()), m_buffer.capacity()); + size_t dat_len = m_is.gcount(); + + if( dat_len == 0 ) + throw ""; + if( dat_len < len ) + throw ""; + + m_buffer.resize( dat_len ); + memcpy(reinterpret_cast<uint8_t*>(buf) + rem, m_buffer.data(), len); + m_buffer_ofs = len; } } diff --git a/src/hir/serialise_lowlevel.hpp b/src/hir/serialise_lowlevel.hpp index 34464683..c1e4a4c8 100644 --- a/src/hir/serialise_lowlevel.hpp +++ b/src/hir/serialise_lowlevel.hpp @@ -127,6 +127,9 @@ class Reader { ::std::ifstream m_backing; ::boost::iostreams::filtering_istream m_is; + + ::std::vector<uint8_t> m_buffer; + unsigned int m_buffer_ofs; public: Reader(const ::std::string& path); Reader(const Writer&) = delete; |