Skip to content

Commit 34f6eb1

Browse files
committed
Foundation: add custom AnyHashable representations to new value types
1 parent 0b82d78 commit 34f6eb1

31 files changed

+432
-0
lines changed

stdlib/public/SDK/Foundation/AffineTransform.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,4 +293,10 @@ extension AffineTransform : _ObjectiveCBridgeable {
293293
}
294294
}
295295

296+
extension NSAffineTransform : _HasCustomAnyHashableRepresentation {
297+
public func _toCustomAnyHashable() -> AnyHashable? {
298+
return AnyHashable(self as AffineTransform)
299+
}
300+
}
301+
296302
#endif

stdlib/public/SDK/Foundation/Calendar.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,3 +1128,9 @@ extension Calendar : _ObjectiveCBridgeable {
11281128
}
11291129
}
11301130

1131+
extension NSCalendar : _HasCustomAnyHashableRepresentation {
1132+
public func _toCustomAnyHashable() -> AnyHashable? {
1133+
return AnyHashable(self as Calendar)
1134+
}
1135+
}
1136+

stdlib/public/SDK/Foundation/CharacterSet.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,12 @@ extension CharacterSet : _ObjectiveCBridgeable {
463463

464464
}
465465

466+
extension NSCharacterSet : _HasCustomAnyHashableRepresentation {
467+
public func _toCustomAnyHashable() -> AnyHashable? {
468+
return AnyHashable(self as CharacterSet)
469+
}
470+
}
471+
466472
extension _SwiftNSCharacterSet {
467473

468474
// Stubs

stdlib/public/SDK/Foundation/Data.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,12 @@ extension Data : _ObjectiveCBridgeable {
723723
}
724724
}
725725

726+
extension NSData : _HasCustomAnyHashableRepresentation {
727+
public func _toCustomAnyHashable() -> AnyHashable? {
728+
return AnyHashable(self as Data)
729+
}
730+
}
731+
726732
/// A NSData subclass that uses Swift reference counting.
727733
///
728734
/// This subclass implements the API of NSData by holding an instance and forwarding all implementation to that object.

stdlib/public/SDK/Foundation/Date.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,12 @@ extension Date : _ObjectiveCBridgeable {
262262
}
263263
}
264264

265+
extension NSDate : _HasCustomAnyHashableRepresentation {
266+
public func _toCustomAnyHashable() -> AnyHashable? {
267+
return AnyHashable(self as Date)
268+
}
269+
}
270+
265271
extension Date : CustomPlaygroundQuickLookable {
266272
var summary: String {
267273
let df = DateFormatter()

stdlib/public/SDK/Foundation/DateComponents.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,3 +345,9 @@ extension DateComponents : _ObjectiveCBridgeable {
345345
}
346346
}
347347

348+
extension NSDateComponents : _HasCustomAnyHashableRepresentation {
349+
public func _toCustomAnyHashable() -> AnyHashable? {
350+
return AnyHashable(self as DateComponents)
351+
}
352+
}
353+

stdlib/public/SDK/Foundation/DateInterval.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,3 +219,11 @@ extension DateInterval : _ObjectiveCBridgeable {
219219
return result!
220220
}
221221
}
222+
223+
@available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
224+
extension NSDateInterval : _HasCustomAnyHashableRepresentation {
225+
public func _toCustomAnyHashable() -> AnyHashable? {
226+
return AnyHashable(self as DateInterval)
227+
}
228+
}
229+

stdlib/public/SDK/Foundation/IndexPath.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,3 +237,10 @@ extension IndexPath : _ObjectiveCBridgeable {
237237
return IndexPath(nsIndexPath: source!)
238238
}
239239
}
240+
241+
extension NSIndexPath : _HasCustomAnyHashableRepresentation {
242+
public func _toCustomAnyHashable() -> AnyHashable? {
243+
return AnyHashable(self as IndexPath)
244+
}
245+
}
246+

stdlib/public/SDK/Foundation/IndexSet.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -884,6 +884,12 @@ extension IndexSet : _ObjectiveCBridgeable {
884884

885885
}
886886

887+
extension NSIndexSet : _HasCustomAnyHashableRepresentation {
888+
public func _toCustomAnyHashable() -> AnyHashable? {
889+
return AnyHashable(self as IndexSet)
890+
}
891+
}
892+
887893
@_silgen_name("__NSIndexSetRangeCount")
888894
internal func __NSIndexSetRangeCount(_ indexSet: NSIndexSet) -> UInt
889895

stdlib/public/SDK/Foundation/Locale.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,3 +481,10 @@ extension Locale : _ObjectiveCBridgeable {
481481
return result!
482482
}
483483
}
484+
485+
extension NSLocale : _HasCustomAnyHashableRepresentation {
486+
public func _toCustomAnyHashable() -> AnyHashable? {
487+
return AnyHashable(self as Locale)
488+
}
489+
}
490+

stdlib/public/SDK/Foundation/Notification.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,3 +151,10 @@ extension Notification : _ObjectiveCBridgeable {
151151
return result!
152152
}
153153
}
154+
155+
extension NSNotification : _HasCustomAnyHashableRepresentation {
156+
public func _toCustomAnyHashable() -> AnyHashable? {
157+
return AnyHashable(self as Notification)
158+
}
159+
}
160+

stdlib/public/SDK/Foundation/PersonNameComponents.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,11 @@ extension PersonNameComponents : _ObjectiveCBridgeable {
135135
return result!
136136
}
137137
}
138+
139+
@available(OSX 10.11, iOS 9.0, *)
140+
extension NSPersonNameComponents : _HasCustomAnyHashableRepresentation {
141+
public func _toCustomAnyHashable() -> AnyHashable? {
142+
return AnyHashable(self as PersonNameComponents)
143+
}
144+
}
145+

stdlib/public/SDK/Foundation/TimeZone.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,3 +276,9 @@ extension TimeZone : _ObjectiveCBridgeable {
276276
}
277277
}
278278

279+
extension NSTimeZone : _HasCustomAnyHashableRepresentation {
280+
public func _toCustomAnyHashable() -> AnyHashable? {
281+
return AnyHashable(self as TimeZone)
282+
}
283+
}
284+

stdlib/public/SDK/Foundation/URL.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,6 +1167,12 @@ extension URL : CustomStringConvertible, CustomDebugStringConvertible {
11671167
}
11681168
}
11691169

1170+
extension NSURL : _HasCustomAnyHashableRepresentation {
1171+
public func _toCustomAnyHashable() -> AnyHashable? {
1172+
return AnyHashable(self as URL)
1173+
}
1174+
}
1175+
11701176
extension URL : CustomPlaygroundQuickLookable {
11711177
public var customPlaygroundQuickLook: PlaygroundQuickLook {
11721178
return .url(absoluteString)

stdlib/public/SDK/Foundation/URLComponents.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,12 @@ extension URLComponents : _ObjectiveCBridgeable {
370370
}
371371
}
372372

373+
extension NSURLComponents : _HasCustomAnyHashableRepresentation {
374+
public func _toCustomAnyHashable() -> AnyHashable? {
375+
return AnyHashable(self as URLComponents)
376+
}
377+
}
378+
373379

374380
/// A single name-value pair, for use with `URLComponents`.
375381
@available(OSX 10.10, iOS 8.0, *)
@@ -454,3 +460,10 @@ extension URLQueryItem : _ObjectiveCBridgeable {
454460
return result!
455461
}
456462
}
463+
464+
@available(OSX 10.10, iOS 8.0, *)
465+
extension NSURLQueryItem : _HasCustomAnyHashableRepresentation {
466+
public func _toCustomAnyHashable() -> AnyHashable? {
467+
return AnyHashable(self as URLQueryItem)
468+
}
469+
}

stdlib/public/SDK/Foundation/URLRequest.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,3 +295,10 @@ extension URLRequest : _ObjectiveCBridgeable {
295295
return result!
296296
}
297297
}
298+
299+
extension NSURLRequest : _HasCustomAnyHashableRepresentation {
300+
public func _toCustomAnyHashable() -> AnyHashable? {
301+
return AnyHashable(self as URLRequest)
302+
}
303+
}
304+

stdlib/public/SDK/Foundation/UUID.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,10 @@ extension UUID : _ObjectiveCBridgeable {
137137
return result!
138138
}
139139
}
140+
141+
extension NSUUID : _HasCustomAnyHashableRepresentation {
142+
public func _toCustomAnyHashable() -> AnyHashable? {
143+
return AnyHashable(self as UUID)
144+
}
145+
}
146+

test/1_stdlib/TestAffineTransform.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,20 @@ class TestAffineTransform : TestAffineTransformSuper {
329329
expectEqual(ref.hashValue, val.hashValue)
330330
}
331331
}
332+
333+
func test_AnyHashableContainingAffineTransform() {
334+
let values = [
335+
AffineTransform.identity,
336+
AffineTransform(m11: -55.66, m12: 22.7, m21: 1.5, m22: 0.0, tX: -22, tY: -33),
337+
AffineTransform(m11: -55.66, m12: 22.7, m21: 1.5, m22: 0.0, tX: -22, tY: -33)
338+
]
339+
let anyHashables = values.map(AnyHashable.init)
340+
expectEqual("AffineTransform", String(anyHashables[0].base.dynamicType))
341+
expectEqual("AffineTransform", String(anyHashables[1].base.dynamicType))
342+
expectEqual("AffineTransform", String(anyHashables[2].base.dynamicType))
343+
expectNotEqual(anyHashables[0], anyHashables[1])
344+
expectEqual(anyHashables[1], anyHashables[2])
345+
}
332346
}
333347

334348
#if !FOUNDATION_XCTEST
@@ -349,6 +363,7 @@ AffineTransformTests.test("test_PrependTransform") { TestAffineTransform().test_
349363
AffineTransformTests.test("test_TransformComposition") { TestAffineTransform().test_TransformComposition() }
350364
AffineTransformTests.test("test_hashing_identity") { TestAffineTransform().test_hashing_identity() }
351365
AffineTransformTests.test("test_hashing_values") { TestAffineTransform().test_hashing_values() }
366+
AffineTransformTests.test("test_AnyHashableContainingAffineTransform") { TestAffineTransform().test_AnyHashableContainingAffineTransform() }
352367
runAllTests()
353368
#endif
354369

test/1_stdlib/TestCalendar.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,20 @@ class TestCalendar : TestCalendarSuper {
255255
expectFalse(c.date(d, matchesComponents: DateComponents(month: 7, day: 31)))
256256
}
257257
}
258+
259+
func test_AnyHashableContainingCalendar() {
260+
let values = [
261+
Calendar(identifier: .gregorian),
262+
Calendar(identifier: .japanese),
263+
Calendar(identifier: .japanese)
264+
]
265+
let anyHashables = values.map(AnyHashable.init)
266+
expectEqual("Calendar", String(anyHashables[0].base.dynamicType))
267+
expectEqual("Calendar", String(anyHashables[1].base.dynamicType))
268+
expectEqual("Calendar", String(anyHashables[2].base.dynamicType))
269+
expectNotEqual(anyHashables[0], anyHashables[1])
270+
expectEqual(anyHashables[1], anyHashables[2])
271+
}
258272
}
259273

260274
#if !FOUNDATION_XCTEST
@@ -263,5 +277,6 @@ CalendarTests.test("test_copyOnWrite") { TestCalendar().test_copyOnWrite() }
263277
CalendarTests.test("test_bridgingAutoupdating") { TestCalendar().test_bridgingAutoupdating() }
264278
CalendarTests.test("test_equality") { TestCalendar().test_equality() }
265279
CalendarTests.test("test_properties") { TestCalendar().test_properties() }
280+
CalendarTests.test("test_AnyHashableContainingCalendar") { TestCalendar().test_AnyHashableContainingCalendar() }
266281
runAllTests()
267282
#endif

test/1_stdlib/TestCharacterSet.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,20 @@ class TestCharacterSet : TestCharacterSetSuper {
152152
expectTrue(cs.classForCoder == expected)
153153
expectTrue(cs.classForKeyedArchiver == expected)
154154
}
155+
156+
func test_AnyHashableContainingCharacterSet() {
157+
let values = [
158+
CharacterSet(charactersIn: "ABC"),
159+
CharacterSet(charactersIn: "XYZ"),
160+
CharacterSet(charactersIn: "XYZ")
161+
]
162+
let anyHashables = values.map(AnyHashable.init)
163+
expectEqual("CharacterSet", String(anyHashables[0].base.dynamicType))
164+
expectEqual("CharacterSet", String(anyHashables[1].base.dynamicType))
165+
expectEqual("CharacterSet", String(anyHashables[2].base.dynamicType))
166+
expectNotEqual(anyHashables[0], anyHashables[1])
167+
expectEqual(anyHashables[1], anyHashables[2])
168+
}
155169
}
156170

157171

@@ -165,6 +179,7 @@ CharacterSetTests.test("testRanges") { TestCharacterSet().testRanges() }
165179
CharacterSetTests.test("testInsertAndRemove") { TestCharacterSet().testInsertAndRemove() }
166180
CharacterSetTests.test("testBasics") { TestCharacterSet().testBasics() }
167181
CharacterSetTests.test("test_classForCoder") { TestCharacterSet().test_classForCoder() }
182+
CharacterSetTests.test("test_AnyHashableContainingCharacterSet") { TestCharacterSet().test_AnyHashableContainingCharacterSet() }
168183
runAllTests()
169184
#endif
170185

test/1_stdlib/TestData.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,20 @@ class TestData : TestDataSuper {
858858
expectTrue(d.classForCoder == expected)
859859
expectTrue(d.classForKeyedArchiver == expected)
860860
}
861+
862+
func test_AnyHashableContainingData() {
863+
let values = [
864+
Data(base64Encoded: "AAAA")!,
865+
Data(base64Encoded: "AAAB")!,
866+
Data(base64Encoded: "AAAB")!,
867+
]
868+
let anyHashables = values.map(AnyHashable.init)
869+
expectEqual("Data", String(anyHashables[0].base.dynamicType))
870+
expectEqual("Data", String(anyHashables[1].base.dynamicType))
871+
expectEqual("Data", String(anyHashables[2].base.dynamicType))
872+
expectNotEqual(anyHashables[0], anyHashables[1])
873+
expectEqual(anyHashables[1], anyHashables[2])
874+
}
861875
}
862876

863877
#if !FOUNDATION_XCTEST
@@ -899,6 +913,7 @@ DataTests.test("test_roundTrip") { TestData().test_roundTrip() }
899913
DataTests.test("test_passing") { TestData().test_passing() }
900914
DataTests.test("test_bufferSizeCalculation") { TestData().test_bufferSizeCalculation() }
901915
DataTests.test("test_classForCoder") { TestData().test_classForCoder() }
916+
DataTests.test("test_AnyHashableContainingData") { TestData().test_AnyHashableContainingData() }
902917

903918
// XCTest does not have a crash detection, whereas lit does
904919
DataTests.test("bounding failure subdata") {

test/1_stdlib/TestDate.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,34 @@ class TestDate : TestDateSuper {
135135
expectEmpty(dc2.day)
136136
expectEqual(1999, dc2.year)
137137
}
138+
139+
func test_AnyHashableContainingDate() {
140+
let values: [Date] = [
141+
dateWithString("2016-05-17 14:49:47 -0700"),
142+
dateWithString("2010-05-17 14:49:47 -0700"),
143+
dateWithString("2010-05-17 14:49:47 -0700"),
144+
]
145+
let anyHashables = values.map(AnyHashable.init)
146+
expectEqual("Date", String(anyHashables[0].base.dynamicType))
147+
expectEqual("Date", String(anyHashables[1].base.dynamicType))
148+
expectEqual("Date", String(anyHashables[2].base.dynamicType))
149+
expectNotEqual(anyHashables[0], anyHashables[1])
150+
expectEqual(anyHashables[1], anyHashables[2])
151+
}
152+
153+
func test_AnyHashableContainingDateComponents() {
154+
let values = [
155+
DateComponents(year: 2016),
156+
DateComponents(year: 1995),
157+
DateComponents(year: 1995),
158+
]
159+
let anyHashables = values.map(AnyHashable.init)
160+
expectEqual("DateComponents", String(anyHashables[0].base.dynamicType))
161+
expectEqual("DateComponents", String(anyHashables[1].base.dynamicType))
162+
expectEqual("DateComponents", String(anyHashables[2].base.dynamicType))
163+
expectNotEqual(anyHashables[0], anyHashables[1])
164+
expectEqual(anyHashables[1], anyHashables[2])
165+
}
138166
}
139167

140168
#if !FOUNDATION_XCTEST
@@ -148,5 +176,7 @@ DateTests.test("testDistantFuture") { TestDate().testDistantFuture() }
148176
DateTests.test("testEquality") { TestDate().testEquality() }
149177
DateTests.test("testTimeIntervalSinceDate") { TestDate().testTimeIntervalSinceDate() }
150178
DateTests.test("testDateComponents") { TestDate().testDateComponents() }
179+
DateTests.test("test_AnyHashableContainingDate") { TestDate().test_AnyHashableContainingDate() }
180+
DateTests.test("test_AnyHashableContainingDateComponents") { TestDate().test_AnyHashableContainingDateComponents() }
151181
runAllTests()
152182
#endif

test/1_stdlib/TestDateInterval.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,24 @@ class TestDateInterval : TestDateIntervalSuper {
129129
expectFalse(testInterval.contains(earlierStart))
130130
}
131131
}
132+
133+
func test_AnyHashableContainingDateInterval() {
134+
if #available(iOS 10.10, OSX 10.12, tvOS 10.0, watchOS 3.0, *) {
135+
let start = dateWithString("2010-05-17 14:49:47 -0700")
136+
let duration = 10000000.0
137+
let values = [
138+
DateInterval(start: start, duration: duration),
139+
DateInterval(start: start, duration: duration / 2),
140+
DateInterval(start: start, duration: duration / 2),
141+
]
142+
let anyHashables = values.map(AnyHashable.init)
143+
expectEqual("DateInterval", String(anyHashables[0].base.dynamicType))
144+
expectEqual("DateInterval", String(anyHashables[1].base.dynamicType))
145+
expectEqual("DateInterval", String(anyHashables[2].base.dynamicType))
146+
expectNotEqual(anyHashables[0], anyHashables[1])
147+
expectEqual(anyHashables[1], anyHashables[2])
148+
}
149+
}
132150
}
133151

134152
#if !FOUNDATION_XCTEST
@@ -137,5 +155,6 @@ DateIntervalTests.test("test_compareDateIntervals") { TestDateInterval().test_co
137155
DateIntervalTests.test("test_isEqualToDateInterval") { TestDateInterval().test_isEqualToDateInterval() }
138156
DateIntervalTests.test("test_checkIntersection") { TestDateInterval().test_checkIntersection() }
139157
DateIntervalTests.test("test_validIntersections") { TestDateInterval().test_validIntersections() }
158+
DateIntervalTests.test("test_AnyHashableContainingDateInterval") { TestDateInterval().test_AnyHashableContainingDateInterval() }
140159
runAllTests()
141160
#endif

0 commit comments

Comments
 (0)