in hessian2/basic_codec/number_codec.cc [195:280]
std::unique_ptr<int64_t> Decoder::decode() {
auto out = std::make_unique<int64_t>();
uint8_t code = reader_->readBE<uint8_t>().second;
switch (code) {
// ::= [xd8-xef] # -x08 to x0f
case 0xd8:
case 0xd9:
case 0xda:
case 0xdb:
case 0xdc:
case 0xdd:
case 0xde:
case 0xdf:
case 0xe0:
case 0xe1:
case 0xe2:
case 0xe3:
case 0xe4:
case 0xe5:
case 0xe6:
case 0xe7:
case 0xe8:
case 0xe9:
case 0xea:
case 0xeb:
case 0xec:
case 0xed:
case 0xee:
case 0xef:
*out.get() = (code - 0xe0);
return out;
// ::= [xf0-xff] b0 # -x800 to x7ff
case 0xf0:
case 0xf1:
case 0xf2:
case 0xf3:
case 0xf4:
case 0xf5:
case 0xf6:
case 0xf7:
case 0xf8:
case 0xf9:
case 0xfa:
case 0xfb:
case 0xfc:
case 0xfd:
case 0xfe:
case 0xff:
if (reader_->byteAvailable() < 1) {
return nullptr;
}
*out.get() = LeftShift<int16_t>(code - 0xf8, 8) +
reader_->readBE<uint8_t>().second;
return out;
// ::= [x38-x3f] b1 b0 # -x40000 to x3ffff
case 0x38:
case 0x39:
case 0x3a:
case 0x3b:
case 0x3c:
case 0x3d:
case 0x3e:
case 0x3f:
if (reader_->byteAvailable() < 2) {
return nullptr;
}
*out.get() = LeftShift<int32_t>(code - 0x3c, 16) +
reader_->readBE<uint16_t>().second;
return out;
// ::= x59 b3 b2 b1 b0 # 32-bit integer cast to long
case 0x59:
if (reader_->byteAvailable() < 4) {
return nullptr;
}
*out.get() = reader_->readBE<int32_t>().second;
return out;
// ::= 'L' b7 b6 b5 b4 b3 b2 b1 b0
case 0x4c:
if (reader_->byteAvailable() < 8) {
return nullptr;
}
*out.get() = reader_->readBE<int64_t>().second;
return out;
}
return nullptr;
}