1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
/*
* MRustC - Rust Compiler
* - By John Hodge (Mutabah/thePowersGang)
*
* hir/serialise_lowlevel.cpp
* - HIR (De)Serialisation low-level "protocol"
*/
#include "serialise_lowlevel.hpp"
#include <boost/iostreams/filter/zlib.hpp>
::HIR::serialise::Writer::Writer(const ::std::string& filename):
m_backing( filename )
{
m_os.push( ::boost::iostreams::zlib_compressor() );
m_os.push( m_backing );
}
void ::HIR::serialise::Writer::write(const void* buf, size_t len)
{
m_os.write(reinterpret_cast<const char*>(buf), len);
}
::HIR::serialise::ReadBuffer::ReadBuffer(size_t cap):
m_ofs(0)
{
m_backing.reserve(cap);
}
size_t ::HIR::serialise::ReadBuffer::read(void* dst, size_t len)
{
size_t rem = m_backing.size() - m_ofs;
if( rem >= len )
{
memcpy(dst, m_backing.data() + m_ofs, len);
m_ofs += len;
return len;
}
else
{
memcpy(dst, m_backing.data() + m_ofs, rem);
m_ofs = m_backing.size();
return rem;
}
}
void ::HIR::serialise::ReadBuffer::populate(::std::istream& is)
{
m_backing.resize( m_backing.capacity(), 0 );
is.read(reinterpret_cast<char*>(m_backing.data()), m_backing.capacity());
m_backing.resize( is.gcount() );
m_ofs = 0;
}
::HIR::serialise::Reader::Reader(const ::std::string& filename):
m_backing( filename ),
m_buffer(1024)
{
m_is.push( ::boost::iostreams::zlib_decompressor() );
m_is.push( m_backing );
}
void ::HIR::serialise::Reader::read(void* buf, size_t len)
{
auto used = m_buffer.read(buf, len);
if( used == len ) {
return ;
}
buf = reinterpret_cast<uint8_t*>(buf) + used;
len -= used;
if( len >= m_buffer.capacity() )
{
m_is.read(reinterpret_cast<char*>(buf), len);
if( !m_is )
throw "";
}
else
{
m_buffer.populate( m_is );
used = m_buffer.read(buf, len);
if( used != len )
throw "";
}
}
|