unpack method

dynamic unpack()

Implementation

Unpackable unpack() {
  int type = unpackUint8();
  if (type < 0x80) {
    return type;
  } else if ((type ^ 0xe0) < 0x20) {
    return (type ^ 0xe0) - 0x20;
  }

  int size;
  if ((size = type ^ 0xa0) <= 0x0f) {
    return unpackRaw(size);
  } else if ((size = type ^ 0xb0) <= 0x0f) {
    return unpackString(size);
  } else if ((size = type ^ 0x90) <= 0x0f) {
    return unpackArray(size);
  } else if ((size = type ^ 0x80) <= 0x0f) {
    return unpackMap(size);
  }

  switch (type) {
    case 0xc0:
      return null;
    case 0xc1:
      return null;
    case 0xc2:
      return false;
    case 0xc3:
      return true;
    case 0xca:
      return unpackFloat();
    case 0xcb:
      return unpackDouble();
    case 0xcc:
      return unpackUint8();
    case 0xcd:
      return unpackUint16();
    case 0xce:
      return unpackUint32();
    case 0xcf:
      return unpackUint64();
    case 0xd0:
      return unpackInt8();
    case 0xd1:
      return unpackInt16();
    case 0xd2:
      return unpackInt32();
    case 0xd3:
      return unpackInt64();
    case 0xd8:
      size = unpackUint16();
      return unpackString(size);
    case 0xd9:
      size = unpackUint32();
      return unpackString(size);
    case 0xda:
      size = unpackUint16();
      return unpackRaw(size);
    case 0xdb:
      size = unpackUint32();
      return unpackRaw(size);
    case 0xdc:
      size = unpackUint16();
      return unpackArray(size);
    case 0xdd:
      size = unpackUint32();
      return unpackArray(size);
    case 0xde:
      size = unpackUint16();
      return unpackMap(size);
    case 0xdf:
      size = unpackUint32();
      return unpackMap(size);
  }
}