std::unique_ptr Decoder::decode()

in hessian2/basic_codec/number_codec.cc [99:157]


std::unique_ptr<int32_t> Decoder::decode() {
  auto out = std::make_unique<int32_t>();
  uint8_t code = reader_->readBE<uint8_t>().second;

  // ::= [x80-xbf]             # -x10 to x3f
  if (code >= 0x80 && code <= 0xbf) {
    *out.get() = (code - 0x90);
    return out;
  }
  switch (code) {
    // ::= [xc0-xcf] b0          # -x800 to x7ff
    case 0xc0:
    case 0xc1:
    case 0xc2:
    case 0xc3:
    case 0xc4:
    case 0xc5:
    case 0xc6:
    case 0xc7:
    case 0xc8:
    case 0xc9:
    case 0xca:
    case 0xcb:
    case 0xcc:
    case 0xcd:
    case 0xce:
    case 0xcf:
      if (reader_->byteAvailable() < 1) {
        return nullptr;
      }
      *out.get() = LeftShift<int16_t>(code - 0xc8, 8) +
                   reader_->readBE<uint8_t>().second;
      return out;
    // ::= [xd0-xd7] b1 b0       # -x40000 to x3ffff
    case 0xd0:
    case 0xd1:
    case 0xd2:
    case 0xd3:
    case 0xd4:
    case 0xd5:
    case 0xd6:
    case 0xd7:
      if (reader_->byteAvailable() < 2) {
        return nullptr;
      }
      *out.get() = LeftShift<int32_t>(code - 0xd4, 16) +
                   reader_->readBE<uint16_t>().second;
      return out;
    // ::= 'I' b3 b2 b1 b0
    case 0x49:
      if (reader_->byteAvailable() < 4) {
        return nullptr;
      }
      *out.get() = reader_->readBE<int32_t>().second;
      return out;
  }

  return nullptr;
}