Add Serializer::writeTailData() and Deserializer::readTailData()

This commit is contained in:
Sebastian Messmer 2015-10-27 21:10:36 +01:00
parent eac8d44b41
commit 64397978e0
2 changed files with 32 additions and 6 deletions

View File

@ -19,13 +19,15 @@ namespace cpputils {
int32_t readInt32(); int32_t readInt32();
uint64_t readUint64(); uint64_t readUint64();
int64_t readInt64(); int64_t readInt64();
Data readData();
std::string readString(); std::string readString();
Data readData();
Data readTailData();
void finished(); void finished();
private: private:
template<typename DataType> DataType _read(); template<typename DataType> DataType _read();
Data _readData(size_t size);
size_t _pos; size_t _pos;
const Data *_source; const Data *_source;
@ -84,6 +86,15 @@ namespace cpputils {
if (_pos + size > _source->size()) { if (_pos + size > _source->size()) {
throw std::runtime_error("Deserialization failed - size overflow"); throw std::runtime_error("Deserialization failed - size overflow");
} }
return _readData(size);
}
inline Data Deserializer::readTailData() {
uint64_t size = _source->size() - _pos;
return _readData(size);
}
inline Data Deserializer::_readData(uint64_t size) {
Data result(size); Data result(size);
std::memcpy(static_cast<char*>(result.data()), static_cast<const char*>(_source->dataOffset(_pos)), size); std::memcpy(static_cast<char*>(result.data()), static_cast<const char*>(_source->dataOffset(_pos)), size);
_pos += size; _pos += size;

View File

@ -4,6 +4,7 @@
#include "Data.h" #include "Data.h"
#include "../macros.h" #include "../macros.h"
#include "../assert/assert.h"
#include <string> #include <string>
namespace cpputils { namespace cpputils {
@ -21,8 +22,12 @@ namespace cpputils {
void writeInt32(int32_t value); void writeInt32(int32_t value);
void writeUint64(uint64_t value); void writeUint64(uint64_t value);
void writeInt64(int64_t value); void writeInt64(int64_t value);
void writeData(const Data &value);
void writeString(const std::string &value); void writeString(const std::string &value);
void writeData(const Data &value);
// Write the data as last element when serializing.
// It does not store a data size but limits the size by the size of the serialization result
void writeTailData(const Data &value);
static size_t DataSize(const Data &value); static size_t DataSize(const Data &value);
static size_t StringSize(const std::string &value); static size_t StringSize(const std::string &value);
@ -31,6 +36,7 @@ namespace cpputils {
private: private:
template<typename DataType> void _write(DataType obj); template<typename DataType> void _write(DataType obj);
void _writeData(const Data &value);
size_t _pos; size_t _pos;
Data _result; Data _result;
@ -85,6 +91,19 @@ namespace cpputils {
inline void Serializer::writeData(const Data &data) { inline void Serializer::writeData(const Data &data) {
writeUint64(data.size()); writeUint64(data.size());
_writeData(data);
}
inline size_t Serializer::DataSize(const Data &data) {
return sizeof(uint64_t) + data.size();
}
inline void Serializer::writeTailData(const Data &data) {
ASSERT(_pos + data.size() == _result.size(), "Not enough data given to write until the end of the stream");
_writeData(data);
}
inline void Serializer::_writeData(const Data &data) {
if (_pos + data.size() > _result.size()) { if (_pos + data.size() > _result.size()) {
throw std::runtime_error("Serialization failed - size overflow"); throw std::runtime_error("Serialization failed - size overflow");
} }
@ -92,10 +111,6 @@ namespace cpputils {
_pos += data.size(); _pos += data.size();
} }
inline size_t Serializer::DataSize(const Data &data) {
return sizeof(uint64_t) + data.size();
}
inline void Serializer::writeString(const std::string &value) { inline void Serializer::writeString(const std::string &value) {
size_t size = value.size() + 1; // +1 for the nullbyte size_t size = value.size() + 1; // +1 for the nullbyte
if (_pos + size > _result.size()) { if (_pos + size > _result.size()) {