in hessian2/basic_codec/number_codec.cc [16:58]
std::unique_ptr<double> Decoder::decode() {
auto out = std::make_unique<double>();
uint8_t code = reader_->readBE<uint8_t>().second;
switch (code) {
// ::= x5b # 0.0
case 0x5b:
*out.get() = 0.0;
return out;
// ::= x5c # 1.0
case 0x5c:
*out.get() = 1.0;
return out;
// ::= x5d b0 # byte cast to double (-128.0 to 127.0)
case 0x5d:
if (reader_->byteAvailable() < 1) {
return nullptr;
}
*out.get() = static_cast<double>(reader_->readBE<int8_t>().second);
return out;
// ::= x5e b1 b0 # short cast to double
case 0x5e:
if (reader_->byteAvailable() < 2) {
return nullptr;
}
*out.get() = static_cast<double>(reader_->readBE<int16_t>().second);
return out;
// ::= x5f b3 b2 b1 b0 # 32-bit float cast to double
case 0x5f:
if (reader_->byteAvailable() < 4) {
return nullptr;
}
*out.get() = readBE<double, 4>(reader_);
return out;
// ::= 'D' b7 b6 b5 b4 b3 b2 b1 b0
case 'D':
if (reader_->byteAvailable() < 8) {
return nullptr;
}
*out.get() = readBE<double, 8>(reader_);
return out;
}
return nullptr;
}