size_t storeNat()

in glean/rts/nat.cpp [238:290]


size_t storeNat(unsigned char* out, uint64_t val) {
  // There is probably ample room for improvement here.
  if (val < 0x80) {
    *out = static_cast<unsigned char>(val);
    return 1;
  } else if (val < 0x4080) {
    folly::storeUnaligned<uint16_t>(
        out, folly::Endian::big(static_cast<uint16_t>(val - 0x80)) | 0x80);
    return 2;
  } else if (val < 0x204080) {
    val -= 0x4080;
    out[0] = 0xC0 | static_cast<unsigned char>(val >> 16);
    folly::storeUnaligned<uint16_t>(
        out + 1, folly::Endian::big(static_cast<uint16_t>(val)));
    return 3;
  } else if (val < 0x10204080) {
    val -= 0x204080;
    folly::storeUnaligned<uint32_t>(
        out, folly::Endian::big(static_cast<uint32_t>(val | 0xE0000000)));
    return 4;
  } else if (val < 0x0810204080) {
    val -= 0x10204080;
    out[0] = 0xF0 | static_cast<unsigned char>(val >> 32);
    folly::storeUnaligned<uint32_t>(
        out + 1, folly::Endian::big(static_cast<uint32_t>(val)));
    return 5;
  } else if (val < 0x040810204080) {
    val -= 0x0810204080;
    folly::storeUnaligned<uint16_t>(
        out, folly::Endian::big(static_cast<uint16_t>((val >> 32) | 0xF800)));
    folly::storeUnaligned<uint32_t>(
        out + 2, folly::Endian::big(static_cast<uint32_t>(val)));
    return 6;
  } else if (val < 0x02040810204080) {
    val -= 0x040810204080;
    out[0] = 0xFC | static_cast<unsigned char>(val >> 48);
    folly::storeUnaligned<uint16_t>(
        out + 1, folly::Endian::big(static_cast<uint16_t>(val >> 32)));
    folly::storeUnaligned<uint32_t>(
        out + 3, folly::Endian::big(static_cast<uint32_t>(val)));
    return 7;
  } else if (val < 0x0102040810204080) {
    val -= 0x02040810204080;
    folly::storeUnaligned<uint64_t>(
        out, folly::Endian::big(val | 0xFE00000000000000Ul));
    return 8;
  } else {
    val -= 0x0102040810204080;
    out[0] = 0xFF;
    folly::storeUnaligned<uint64_t>(out + 1, folly::Endian::big(val));
    return 9;
  }
}