summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-19 11:10:13 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-19 11:10:13 +0800
commite2851874b4d3e8dcd3a65e52ef7de11b1d4db1c1 (patch)
treedf6bcf99468aee7b986da838d0c3a308458e4bc7 /src
parent5f8a9437fbbf78d966aa5811424d12d62d8b65a6 (diff)
downloadmrust-e2851874b4d3e8dcd3a65e52ef7de11b1d4db1c1.tar.gz
HIR Deserialise - Add a 1KB buffer to the front
Diffstat (limited to 'src')
-rw-r--r--src/hir/serialise_lowlevel.cpp43
-rw-r--r--src/hir/serialise_lowlevel.hpp3
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;