3 * - By John Hodge (thePowersGang)
8 #include <serialisation.hpp>
14 CDeserialiser::CDeserialiser(size_t Length, const uint8_t *Buffer):
21 bool CDeserialiser::IsConsumed() const
23 return m_offset == m_length;
26 ::uint8_t CDeserialiser::ReadU8()
28 if( m_offset + 1 >= m_length )
29 throw ::std::out_of_range("CDeserialiser::ReadU8");
30 uint8_t rv = m_data[m_offset];
35 ::uint16_t CDeserialiser::ReadU16()
37 if( m_offset + 2 >= m_length )
38 throw ::std::out_of_range("CDeserialiser::ReadU16");
40 uint16_t rv = m_data[m_offset] | ((uint16_t)m_data[m_offset+1] << 8);
45 ::int16_t CDeserialiser::ReadS16()
47 uint16_t rv_u = ReadU16();
54 const ::std::string CDeserialiser::ReadString()
56 if( m_offset + 1 >= m_length )
57 throw ::std::out_of_range("CDeserialiser::ReadString");
58 uint8_t len = m_data[m_offset];
61 if( m_offset + len >= m_length )
62 throw ::std::out_of_range("CDeserialiser::ReadString");
64 ::std::string ret( reinterpret_cast<const char*>(m_data+m_offset), len );
69 CSerialiser::CSerialiser()
73 void CSerialiser::WriteU8(::uint8_t Value)
75 m_data.push_back(Value);
78 void CSerialiser::WriteU16(::uint16_t Value)
80 m_data.push_back(Value & 0xFF);
81 m_data.push_back(Value >> 8);
84 void CSerialiser::WriteS16(::int16_t Value)
88 ::uint16_t rawval = 0x10000 - (::int32_t)Value;
97 void CSerialiser::WriteBuffer(size_t n, const void* val)
99 const uint8_t* val8 = static_cast<const uint8_t*>(val);
101 throw ::std::length_error("CSerialiser::WriteBuffer");
102 m_data.reserve( m_data.size() + 2 + n );
104 for( size_t i = 0; i < n; i ++ )
105 m_data.push_back(val8[i]);
108 void CSerialiser::WriteString(const char* val, size_t n)
111 throw ::std::length_error("CSerialiser::WriteString");
112 m_data.reserve( m_data.size() + 1 + n );
114 for( size_t i = 0; i < n; i ++ )
115 m_data.push_back(val[i]);
118 void CSerialiser::WriteSub(const CSerialiser& val)
120 // TODO: Append reference to sub-buffer contents
121 m_data.reserve( m_data.size() + val.m_data.size() );
122 for( auto byte : val.m_data )
123 m_data.push_back( byte );
126 const ::std::vector<uint8_t>& CSerialiser::Compact()
131 }; // namespace AxWin