3 * - By John Hodge (thePowersGang)
8 #include <serialisation.hpp>
11 #include <acess/sys.h> // SysDebug
15 CDeserialiser::CDeserialiser(size_t Length, const uint8_t *Buffer):
22 bool CDeserialiser::IsConsumed() const
24 return m_offset == m_length;
27 ::uint8_t CDeserialiser::ReadU8()
29 RangeCheck("CDeserialiser::ReadU8", 1);
30 uint8_t rv = m_data[m_offset];
35 ::uint16_t CDeserialiser::ReadU16()
37 RangeCheck("CDeserialiser::ReadU16", 2);
38 uint16_t rv = m_data[m_offset] | ((uint16_t)m_data[m_offset+1] << 8);
43 ::int16_t CDeserialiser::ReadS16()
45 uint16_t rv_u = ReadU16();
52 const ::std::vector<uint8_t> CDeserialiser::ReadBuffer()
54 RangeCheck("CDeserialiser::ReadBuffer(len)", 2);
55 size_t size = ReadU16();
57 ::std::vector<uint8_t> ret( size );
58 for( size_t i = 0; i < size; i ++ )
59 ret[i] = m_data[m_offset++];
63 const ::std::string CDeserialiser::ReadString()
65 RangeCheck("CDeserialiser::ReadString(len)", 1);
66 uint8_t len = m_data[m_offset];
69 RangeCheck("CDeserialiser::ReadString(data)", len);
70 ::std::string ret( reinterpret_cast<const char*>(m_data+m_offset), len );
75 void CDeserialiser::RangeCheck(const char *Method, size_t bytes) throw(::std::out_of_range)
77 if( m_offset + bytes > m_length ) {
78 ::_SysDebug("%s - out of range %i+%i >= %i", Method, m_offset, bytes, m_length);
79 throw ::std::out_of_range(Method);
83 CSerialiser::CSerialiser()
87 void CSerialiser::WriteU8(::uint8_t Value)
89 m_data.push_back(Value);
92 void CSerialiser::WriteU16(::uint16_t Value)
94 m_data.push_back(Value & 0xFF);
95 m_data.push_back(Value >> 8);
98 void CSerialiser::WriteS16(::int16_t Value)
102 ::uint16_t rawval = 0x10000 - (::int32_t)Value;
111 void CSerialiser::WriteBuffer(size_t n, const void* val)
113 const uint8_t* val8 = static_cast<const uint8_t*>(val);
115 throw ::std::length_error("CSerialiser::WriteBuffer");
116 m_data.reserve( m_data.size() + 2 + n );
118 for( size_t i = 0; i < n; i ++ )
119 m_data.push_back(val8[i]);
122 void CSerialiser::WriteString(const char* val, size_t n)
125 throw ::std::length_error("CSerialiser::WriteString");
126 m_data.reserve( m_data.size() + 1 + n );
128 for( size_t i = 0; i < n; i ++ )
129 m_data.push_back(val[i]);
132 void CSerialiser::WriteSub(const CSerialiser& val)
134 // TODO: Append reference to sub-buffer contents
135 m_data.reserve( m_data.size() + val.m_data.size() );
136 for( auto byte : val.m_data )
137 m_data.push_back( byte );
140 const ::std::vector<uint8_t>& CSerialiser::Compact()
145 }; // namespace AxWin