std::unique_ptr Decoder::decode()

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;
}