Loading...
--- dyld/dyld-1340/lsl/PVLEInt64.cpp
+++ dyld/dyld-1122.1/lsl/PVLEInt64.cpp
@@ -47,27 +47,32 @@
std::copy(&valueBytes[0], &valueBytes[bytes], std::back_inserter(data));
}
-bool readPVLEUInt64(std::span<std::byte>& data, uint64_t& result) {
- result = 0;
- if (data.size() == 0) {
- return false;
+uint64_t readPVLEUInt64(std::span<std::byte>& data) {
+ uint64_t result = 0;
+ contract(data.size() != 0);
+ const uint8_t additionalByteCount = std::countr_zero((uint8_t)data[0]);
+ if (additionalByteCount == 8) {
+ std::copy(&data[1], &data[9], (std::byte*)&result);
+ data = data.last(data.size()-9);
+ return result;
}
- const uint8_t additionalByteCount = std::countr_zero((uint8_t)data[0]);
- if (data.size() < additionalByteCount+1) {
- return false;
- }
- if (additionalByteCount == 8) {
- std::copy(data.begin()+1, data.begin()+9, (std::byte*)&result);
- data = data.last(data.size()-9);
- return true;
- }
+ contract(data.size() >= 1+additionalByteCount);
const uint8_t extraBitCount = 8 - (additionalByteCount+1);
const uint8_t extraBits = (((uint8_t)(data[0]))>>(additionalByteCount+1)) & ((1<<extraBitCount)-1);
- std::copy(data.begin()+1, data.begin()+additionalByteCount+1, (std::byte*)&result);
+ std::copy(&data[1], &data[additionalByteCount+1], (std::byte*)&result);
result <<= extraBitCount;
result |= extraBits;
data = data.last(data.size()-(additionalByteCount+1));
- return true;
+ return result;
+}
+
+void emitPVLEInt64(int64_t value, Vector<std::byte>& data) {
+ emitPVLEUInt64((value >> 63) ^ (value << 1), data);
+}
+
+int64_t readPVLEInt64(std::span<std::byte>& data) {
+ uint64_t value = readPVLEUInt64(data);
+ return ((value & 1) ? (value >> 1) ^ -1 : (value >> 1));
}
};