Skip to content

Commit 03ba1a9

Browse files
committed
data identical
1 parent 5cf1d36 commit 03ba1a9

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

Sources/FoundationEssentials/Data/Data.swift

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2974,3 +2974,53 @@ extension Data : Codable {
29742974
}
29752975
}
29762976
}
2977+
2978+
extension Data {
2979+
/// Returns a boolean value indicating whether this data is identical to
2980+
/// `other`.
2981+
///
2982+
/// Two data values are identical if there is no way to distinguish between
2983+
/// them.
2984+
///
2985+
/// Comparing data this way includes comparing (normally) hidden
2986+
/// implementation details such as the memory location of any underlying
2987+
/// data storage object. Therefore, identical data are guaranteed to
2988+
/// compare equal with `==`, but not all equal data are considered
2989+
/// identical.
2990+
///
2991+
/// - Performance: O(1)
2992+
@_alwaysEmitIntoClient
2993+
public func isIdentical(to other: Self) -> Bool {
2994+
// See if both are empty
2995+
switch (self._representation, other._representation) {
2996+
case (.empty, .empty):
2997+
return true
2998+
case (.inline, .inline), (.slice, .slice), (.large, .large):
2999+
// Continue on to checks below
3000+
break
3001+
default:
3002+
return false
3003+
}
3004+
3005+
let length1 = self.count
3006+
let length2 = other.count
3007+
3008+
// Unequal length data can never be equal
3009+
guard length1 == length2 else {
3010+
return false
3011+
}
3012+
3013+
if length1 > 0 {
3014+
return self.withUnsafeBytes { (b1: UnsafeRawBufferPointer) in
3015+
return other.withUnsafeBytes { (b2: UnsafeRawBufferPointer) in
3016+
// If they have the same base address and same count, it is equal
3017+
let b1Address = b1.baseAddress!
3018+
let b2Address = b2.baseAddress!
3019+
3020+
return b1Address == b2Address
3021+
}
3022+
}
3023+
}
3024+
return true
3025+
}
3026+
}

0 commit comments

Comments
 (0)