Bytes
Bytes copied to clipboard
Conform Bytes to Comparable
Low level enough to be good to implemented here, especially useful when comparing byte arrays that represent lexicographical keys.
extension Array: Comparable where Element: Comparable {
public static func < (lhs: [Element], rhs: [Element]) -> Bool {
for (leftElement, rightElement) in zip(lhs, rhs) {
if leftElement < rightElement {
return true
} else if leftElement > rightElement {
return false
}
}
return lhs.count < rhs.count
}
}
Sneakier solution: https://github.com/apple/swift/blob/aa3e5904f8ba8bf9ae06d96946774d171074f6e5/stdlib/public/core/StringComparison.swift#L280-L295
// Perform a binary comparison of bytes in memory. Return value is negative if
// less, 0 if equal, positive if greater.
@_effects(readonly)
internal func _binaryCompare<UInt8>(
_ lhs: UnsafeBufferPointer<UInt8>, _ rhs: UnsafeBufferPointer<UInt8>
) -> Int {
var cmp = Int(truncatingIfNeeded:
_swift_stdlib_memcmp(
lhs.baseAddress._unsafelyUnwrappedUnchecked,
rhs.baseAddress._unsafelyUnwrappedUnchecked,
Swift.min(lhs.count, rhs.count)))
if cmp == 0 {
cmp = lhs.count &- rhs.count
}
return cmp
}
https://github.com/apple/swift/blob/aa3e5904f8ba8bf9ae06d96946774d171074f6e5/stdlib/public/SwiftShims/LibcShims.h#L70-L75
SWIFT_READONLY
static inline int _swift_stdlib_memcmp(const void *s1, const void *s2,
__swift_size_t n) {
extern int memcmp(const void *, const void *, __swift_size_t);
return memcmp(s1, s2, n);
}