hessian2/basic_codec/class_instance_codec.cc (46 lines of code) (raw):
#include "hessian2/basic_codec/class_instance_codec.hpp"
namespace Hessian2 {
// class-def ::= 'C' string int string*
// object ::= 'O' int value*
// ::= [x60-x6f] value*
template <>
std::unique_ptr<ClassInstanceObject> Decoder::decode() {
Object::ClassInstance instance;
auto result = std::make_unique<ClassInstanceObject>();
values_ref_.push_back(result.get());
auto ret = reader_->peek<uint8_t>();
if (!ret.first) {
return nullptr;
}
// Read the actual definition
if (ret.second == 'C') {
auto def = decode<Object::Definition>();
if (!def) {
return nullptr;
}
}
// Find the definition by reference
auto def = decode<Object::Definition>();
if (!def) {
return nullptr;
}
instance.def_ = def->data_;
auto obj_len = def->data_->field_names_.size();
for (size_t i = 0; i < obj_len; i++) {
auto o = decode<Object>();
if (!o) {
return nullptr;
}
instance.data_.emplace_back(std::move(o));
}
result->setClassInstance(std::move(instance));
return result;
}
template <>
bool Encoder::encode(const ClassInstanceObject& value) {
values_ref_.emplace(&value, values_ref_.size());
auto class_instance = value.toClassInstance();
ABSL_ASSERT(class_instance.has_value());
auto& class_instance_value = class_instance.value().get();
encode<Object::RawDefinition>(*class_instance_value.def_);
for (const auto& value : class_instance_value.data_) {
encode<Object>(*value);
}
return true;
}
} // namespace Hessian2