summaryrefslogtreecommitdiff
path: root/src/hir/serialise_lowlevel.cpp
blob: a7c1a0c70377e402e33bfc5a79d7aa4b8b9787b6 (plain)
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 "";
    }
}