From b1d2887139ac610664178863d33f3b87f0e4688c Mon Sep 17 00:00:00 2001 From: Doug Gregor Date: Wed, 5 Oct 2016 09:28:02 -0700 Subject: [PATCH] [AnyHashable] Eliminate the _AnyHashableProtocol hack. Now that we have the ability to write extensions where one of the type parameters is equivalent to a concrete type, eliminate _AnyHashableProtocol and provide AnyHashable-specific behavior for Dictionary (where Key == AnyHashable) and Set (where Element == AnyHashable) rather than employing the "Key: _AnyHashableProtocol" hack. Fixes standard library ABI FIXME's #35, #37, #39. --- ...CollectionsAnyHashableExtensions.swift.gyb | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/stdlib/public/core/HashedCollectionsAnyHashableExtensions.swift.gyb b/stdlib/public/core/HashedCollectionsAnyHashableExtensions.swift.gyb index 406117e8af26e..b38ae8c4f34b9 100644 --- a/stdlib/public/core/HashedCollectionsAnyHashableExtensions.swift.gyb +++ b/stdlib/public/core/HashedCollectionsAnyHashableExtensions.swift.gyb @@ -10,16 +10,6 @@ // //===----------------------------------------------------------------------===// -// FIXME(ABI)#35 (Concrete Same Type Requirements): This protocol exists to identify -// `AnyHashable` in conditional extensions. Replace this protocol -// with conditional extensions on `Set` and `Dictionary` "where Key == -// AnyHashable". -public protocol _AnyHashableProtocol { - var base: Any { get } -} - -extension AnyHashable : _AnyHashableProtocol {} - //===----------------------------------------------------------------------===// // Convenience APIs for Set //===----------------------------------------------------------------------===// @@ -49,8 +39,7 @@ extension Set { } } -// FIXME(ABI)#37 (Concrete Same Type Requirements): replace with `where Element == AnyHashable`. -extension Set where Element : _AnyHashableProtocol { +extension Set where Element == AnyHashable { public mutating func insert( _ newMember: ConcreteElement ) -> (inserted: Bool, memberAfterInsert: ConcreteElement) { @@ -65,7 +54,7 @@ extension Set where Element : _AnyHashableProtocol { public mutating func update( with newMember: ConcreteElement ) -> ConcreteElement? { - return _concreteElement_update(with: AnyHashable(newMember) as! Element) + return _concreteElement_update(with: AnyHashable(newMember)) .map { $0.base as! ConcreteElement } } @@ -73,7 +62,7 @@ extension Set where Element : _AnyHashableProtocol { public mutating func remove( _ member: ConcreteElement ) -> ConcreteElement? { - return _concreteElement_remove(AnyHashable(member) as! Element) + return _concreteElement_remove(AnyHashable(member)) .map { $0.base as! ConcreteElement } } } @@ -109,16 +98,15 @@ extension Dictionary { } } -// FIXME(ABI)#39 (Concrete Same Type Requirements): replace with `where Element == AnyHashable`. -extension Dictionary where Key : _AnyHashableProtocol { +extension Dictionary where Key == AnyHashable { public subscript(_ key: _Hashable) -> Value? { // FIXME(ABI)#40 (Generic subscripts): replace this API with a // generic subscript. get { - return self[_concreteKey: key._toAnyHashable() as! Key] + return self[_concreteKey: key._toAnyHashable()] } set { - self[_concreteKey: key._toAnyHashable() as! Key] = newValue + self[_concreteKey: key._toAnyHashable()] = newValue } } @@ -126,14 +114,14 @@ extension Dictionary where Key : _AnyHashableProtocol { public mutating func updateValue( _ value: Value, forKey key: ConcreteKey ) -> Value? { - return _concreteKey_updateValue(value, forKey: AnyHashable(key) as! Key) + return _concreteKey_updateValue(value, forKey: AnyHashable(key)) } @discardableResult public mutating func removeValue( forKey key: ConcreteKey ) -> Value? { - return _concreteKey_removeValue(forKey: AnyHashable(key) as! Key) + return _concreteKey_removeValue(forKey: AnyHashable(key)) } }