[6.2.1] Add Equatable and Hashable conformance to GUID.

This commit is contained in:
Jonathan Grynspan
2025-10-10 08:38:23 -04:00
parent 64d688f85e
commit a028ae16f4
2 changed files with 50 additions and 0 deletions

View File

@@ -318,3 +318,31 @@ func _convertWindowsBoolToBool(_ b: WindowsBool) -> Bool {
return b.boolValue
}
// GUID
extension GUID {
@usableFromInline @_transparent
internal var uint128Value: UInt128 {
unsafe withUnsafeBytes(of: self) { buffer in
// GUID is 32-bit-aligned only, so use loadUnaligned().
unsafe buffer.baseAddress!.loadUnaligned(as: UInt128.self)
}
}
}
// These conformances are marked @retroactive because the GUID type nominally
// comes from the _GUIDDef clang module rather than the WinSDK clang module.
extension GUID: @retroactive Equatable {
@_transparent
public static func ==(lhs: Self, rhs: Self) -> Bool {
lhs.uint128Value == rhs.uint128Value
}
}
extension GUID: @retroactive Hashable {
@_transparent
public func hash(into hasher: inout Hasher) {
hasher.combine(uint128Value)
}
}

View File

@@ -0,0 +1,22 @@
// RUN: %target-build-swift %s -o %t.exe
// RUN: %target-codesign %t.exe
// RUN: %target-run %t.exe
// REQUIRES: executable_test
// REQUIRES: OS=windows-msvc
// Make sure that importing WinSDK brings in the GUID type, which is declared in
// /shared and not in /um.
import WinSDK
public func usesGUID(_ x: GUID) {}
// Make sure equating and hashing GUIDs works.
let guid: GUID = GUID_NULL
assert(guid == guid)
assert(guid.hashValue == guid.hashValue)
let guid2: GUID = IID_IUnknown
assert(guid != guid2)
assert(guid.hashValue != guid2.hashValue) // well, probably