mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Like NSObject, CFType has primitive operations CFEqual and CFHash, so Swift should allow those types to show up in Hashable positions (like dictionaries). The most general way to do this was to introduce a new protocol, _CFObject, and then have the importer automatically make all CF types conform to it. This did require one additional change: the == implementation that calls through to CFEqual is in a new CoreFoundation overlay, but the conformance is in the underlying Clang module. Therefore, operator lookup for conformances has been changed to look in the overlay for an imported declaration (if there is one). This re-applies361ab62454, reverted inf50b1e73dc, after a /very/ long interval where we decided if it was worth breaking people who've added these conformances on their own. Since the workaround isn't too difficult--- use `#if swift(>=3.2)` to guard the extension introducing the conformance---it was deemed acceptable. https://bugs.swift.org/browse/SR-2388
62 lines
2.2 KiB
Swift
62 lines
2.2 KiB
Swift
// RUN: %target-run-simple-swift | %FileCheck %s
|
|
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: objc_interop
|
|
|
|
import CoreFoundation
|
|
// Can't import StdlibUnittest; that brings in Foundation.
|
|
|
|
extension CFString {
|
|
static func from(_ contents: String) -> CFString {
|
|
return CFStringCreateWithCString(nil, contents, /*ascii*/0)
|
|
}
|
|
|
|
static func mutablyFrom(_ contents: String) -> CFMutableString {
|
|
return CFStringCreateMutableCopy(nil, /*maxLength*/0, CFString.from(contents))
|
|
}
|
|
}
|
|
|
|
do {
|
|
print("Testing Array<CFString>") // CHECK-LABEL: Testing Array<CFString>
|
|
var s = [CFString]()
|
|
// Use long strings to avoid the tagged pointer optimization.
|
|
s.append(.from("abcxxxxxxxxxxx"))
|
|
s.append(.from("defxxxxxxxxxxx"))
|
|
print(s.contains(.from("abcxxxxxxxxxxx"))) // CHECK-NEXT: true
|
|
print(s.contains(.from("efxxxxxxxxxxx"))) // CHECK-NEXT: false
|
|
}
|
|
|
|
do {
|
|
print("Testing Array<CFMutableString>") // CHECK-LABEL: Testing Array<CFMutableString>
|
|
var s = [CFMutableString]()
|
|
// Use long strings to avoid the tagged pointer optimization.
|
|
s.append(.mutablyFrom("abcxxxxxxxxxxx"))
|
|
s.append(.mutablyFrom("defxxxxxxxxxxx"))
|
|
print(s.contains(.mutablyFrom("abcxxxxxxxxxxx"))) // CHECK-NEXT: true
|
|
print(s.contains(.mutablyFrom("efxxxxxxxxxxx"))) // CHECK-NEXT: false
|
|
|
|
let upcast = s as [CFString]
|
|
print(upcast.contains(CFString.mutablyFrom("abcxxxxxxxxxxx"))) // CHECK-NEXT: true
|
|
print(upcast.contains(CFString.from("abcxxxxxxxxxxx"))) // CHECK-NEXT: true
|
|
}
|
|
|
|
do {
|
|
print("Testing Set<CFString>") // CHECK-LABEL: Testing Set<CFString>
|
|
var s = Set<CFString>()
|
|
// Use long strings to avoid the tagged pointer optimization.
|
|
s.insert(.from("abcxxxxxxxxxxx"))
|
|
s.insert(.from("defxxxxxxxxxxx"))
|
|
print(s.contains(.from("abcxxxxxxxxxxx"))) // CHECK-NEXT: true
|
|
print(s.contains(.from("efxxxxxxxxxxx"))) // CHECK-NEXT: false
|
|
}
|
|
|
|
do {
|
|
print("Testing Set<CFMutableString>") // CHECK-LABEL: Testing Set<CFMutableString>
|
|
// This is a horrible thing to do but we're just checking that the conformance works.
|
|
var s = Set<CFMutableString>()
|
|
s.insert(.mutablyFrom("abcxxxxxxxxxxx"))
|
|
s.insert(.mutablyFrom("defxxxxxxxxxxx"))
|
|
print(s.contains(.mutablyFrom("abcxxxxxxxxxxx"))) // CHECK-NEXT: true
|
|
print(s.contains(.mutablyFrom("efxxxxxxxxxxx"))) // CHECK-NEXT: false
|
|
}
|