Loading...
lsl/PVLEInt64.cpp dyld-1340 dyld-1122.1
--- 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));
 }
 
 };