Add Packer/Unpacker, add serialization to LuaSnap
This commit is contained in:
115
luprex/core/cpp/packer.cpp
Normal file
115
luprex/core/cpp/packer.cpp
Normal file
@@ -0,0 +1,115 @@
|
||||
#include <packer.hpp>
|
||||
#include <cassert>
|
||||
|
||||
void Packer::write_int8(int8_t v) {
|
||||
oss_->write((const char *)&v, sizeof(v));
|
||||
}
|
||||
|
||||
void Packer::write_int16(int16_t v) {
|
||||
oss_->write((const char *)&v, sizeof(v));
|
||||
}
|
||||
|
||||
void Packer::write_int32(int32_t v) {
|
||||
oss_->write((const char *)&v, sizeof(v));
|
||||
}
|
||||
|
||||
void Packer::write_int64(int64_t v) {
|
||||
oss_->write((const char *)&v, sizeof(v));
|
||||
}
|
||||
|
||||
void Packer::overwrite_int8(size_t tell_after, int8_t v) {
|
||||
oss_->seekp(tell_after - 1);
|
||||
write_int8(v);
|
||||
oss_->seekp(0, std::ios_base::end);
|
||||
}
|
||||
|
||||
void Packer::overwrite_int16(size_t tell_after, int16_t v) {
|
||||
oss_->seekp(tell_after - 2);
|
||||
write_int16(v);
|
||||
oss_->seekp(0, std::ios_base::end);
|
||||
}
|
||||
|
||||
void Packer::overwrite_int32(size_t tell_after, int32_t v) {
|
||||
oss_->seekp(tell_after - 4);
|
||||
write_int32(v);
|
||||
oss_->seekp(0, std::ios_base::end);
|
||||
}
|
||||
|
||||
void Packer::overwrite_int64(size_t tell_after, int64_t v) {
|
||||
oss_->seekp(tell_after - 8);
|
||||
write_int64(v);
|
||||
oss_->seekp(0, std::ios_base::end);
|
||||
}
|
||||
|
||||
int Packer::lua_writer(lua_State *L, const void *p, size_t sz, void *ud) {
|
||||
Packer *pkr = (Packer *)ud;
|
||||
pkr->oss_->write((const char *)p, sz);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Unpacker::Unpacker(const char *d, size_t s) {
|
||||
assert(d != nullptr);
|
||||
assert(s >= 0);
|
||||
data_ = d;
|
||||
size_ = s;
|
||||
}
|
||||
|
||||
int8_t Unpacker::read_int8() {
|
||||
assert(size_ >= 1);
|
||||
int8_t result;
|
||||
memcpy(&result, data_, 1);
|
||||
data_ += 1;
|
||||
size_ -= 1;
|
||||
return result;
|
||||
}
|
||||
|
||||
int16_t Unpacker::read_int16() {
|
||||
assert(size_ >= 2);
|
||||
int16_t result;
|
||||
memcpy(&result, data_, 2);
|
||||
data_ += 2;
|
||||
size_ -= 2;
|
||||
return result;
|
||||
}
|
||||
|
||||
int32_t Unpacker::read_int32() {
|
||||
assert(size_ >= 4);
|
||||
int32_t result;
|
||||
memcpy(&result, data_, 4);
|
||||
data_ += 4;
|
||||
size_ -= 4;
|
||||
return result;
|
||||
}
|
||||
|
||||
int64_t Unpacker::read_int64() {
|
||||
assert(size_ >= 8);
|
||||
int64_t result;
|
||||
memcpy(&result, data_, 8);
|
||||
data_ += 8;
|
||||
size_ -= 8;
|
||||
return result;
|
||||
}
|
||||
|
||||
void Unpacker::skip(size_t n) {
|
||||
assert(size_ >= n);
|
||||
data_ += n;
|
||||
size_ -= n;
|
||||
}
|
||||
|
||||
Unpacker Unpacker::read_section(size_t n) {
|
||||
assert(size_ >= n);
|
||||
const char *d = data_;
|
||||
data_ += n;
|
||||
size_ -= n;
|
||||
return Unpacker(d, n);
|
||||
}
|
||||
|
||||
const char *Unpacker::lua_reader(lua_State *L, void *ud, size_t *size) {
|
||||
Unpacker *unpk = (Unpacker *)ud;
|
||||
const char *retval = unpk->data_;
|
||||
*size = unpk->size_;
|
||||
if (unpk->size_ == 0) retval = nullptr;
|
||||
unpk->data_ += unpk->size_;
|
||||
unpk->size_ = 0;
|
||||
return retval;
|
||||
}
|
||||
Reference in New Issue
Block a user