std::unique_ptr Decoder::decode()

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