3 * - By John Hodge (thePowersGang)
8 #include <serialisation.hpp>
11 #include <acess/sys.h> // SysDebug
15 CDeserialiser::CDeserialiser(const ::std::vector<uint8_t>& vector):
20 CDeserialiser::CDeserialiser(::std::vector<uint8_t>&& vector):
25 CDeserialiser& CDeserialiser::operator=(const CDeserialiser& x)
28 m_offset = x.m_offset;
31 bool CDeserialiser::IsConsumed() const
33 return m_offset == m_vect.size();
36 ::uint8_t CDeserialiser::ReadU8()
38 RangeCheck("CDeserialiser::ReadU8", 1);
39 uint8_t rv = m_vect[m_offset];
44 ::uint16_t CDeserialiser::ReadU16()
46 RangeCheck("CDeserialiser::ReadU16", 2);
47 uint16_t rv = m_vect[m_offset] | ((uint16_t)m_vect[m_offset+1] << 8);
52 ::int16_t CDeserialiser::ReadS16()
54 uint16_t rv_u = ReadU16();
61 ::uint32_t CDeserialiser::ReadU32()
63 uint32_t rv = ReadU16();
64 rv |= (uint32_t)ReadU16() << 16;
68 ::uint64_t CDeserialiser::ReadU64()
70 uint64_t rv = ReadU32();
71 rv |= (uint64_t)ReadU32() << 32;
75 const ::std::vector<uint8_t> CDeserialiser::ReadBuffer()
77 RangeCheck("CDeserialiser::ReadBuffer(len)", 2);
78 size_t size = ReadU16();
80 auto range_start = m_vect.begin() + int(m_offset);
81 ::std::vector<uint8_t> ret( range_start, range_start + int(size) );
86 const ::std::string CDeserialiser::ReadString()
88 RangeCheck("CDeserialiser::ReadString(len)", 1);
89 uint8_t len = ReadU8();
91 RangeCheck("CDeserialiser::ReadString(data)", len);
92 ::std::string ret( reinterpret_cast<const char*>(m_vect.data()+m_offset), len );
97 void CDeserialiser::RangeCheck(const char *Method, size_t bytes) throw(::std::out_of_range)
99 if( m_offset + bytes > m_vect.size() ) {
100 ::_SysDebug("%s - out of range %i+%i >= %i", Method, m_offset, bytes, m_vect.size());
101 throw ::std::out_of_range(Method);
105 CSerialiser::CSerialiser()
109 void CSerialiser::WriteU8(::uint8_t Value)
111 m_data.push_back(Value);
114 void CSerialiser::WriteU16(::uint16_t Value)
116 m_data.push_back(Value & 0xFF);
117 m_data.push_back(Value >> 8);
120 void CSerialiser::WriteS16(::int16_t Value)
124 ::uint16_t rawval = 0x10000 - (::int32_t)Value;
133 void CSerialiser::WriteU32(::uint32_t Value)
135 m_data.push_back(Value & 0xFF);
136 m_data.push_back(Value >> 8);
137 m_data.push_back(Value >> 16);
138 m_data.push_back(Value >> 24);
141 void CSerialiser::WriteU64(::uint64_t Value)
147 void CSerialiser::WriteBuffer(size_t n, const void* val)
149 const uint8_t* val8 = static_cast<const uint8_t*>(val);
151 throw ::std::length_error("CSerialiser::WriteBuffer");
152 m_data.reserve( m_data.size() + 2 + n );
154 for( size_t i = 0; i < n; i ++ )
155 m_data.push_back(val8[i]);
158 void CSerialiser::WriteString(const char* val, size_t n)
161 throw ::std::length_error("CSerialiser::WriteString");
162 m_data.reserve( m_data.size() + 1 + n );
164 for( size_t i = 0; i < n; i ++ )
165 m_data.push_back(val[i]);
168 void CSerialiser::WriteSub(const CSerialiser& val)
170 // TODO: Append reference to sub-buffer contents
171 m_data.reserve( m_data.size() + val.m_data.size() );
172 for( auto byte : val.m_data )
173 m_data.push_back( byte );
176 const ::std::vector<uint8_t>& CSerialiser::Compact()
181 }; // namespace AxWin