//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See http://swift.org/LICENSE.txt for license information // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // Convenience APIs for Set //===----------------------------------------------------------------------===// // FIXME(ABI)#36 (Overload resolution): remove these trampolines when extensions below can be // properly expressed in the language. extension Set { @inline(__always) internal mutating func _concreteElement_insert( _ newMember: Element ) -> (inserted: Bool, memberAfterInsert: Element) { return insert(newMember) } @inline(__always) internal mutating func _concreteElement_update( with newMember: Element ) -> Element? { return update(with: newMember) } @inline(__always) internal mutating func _concreteElement_remove( _ member: Element ) -> Element? { return remove(member) } } extension Set where Element == AnyHashable { public mutating func insert( _ newMember: ConcreteElement ) -> (inserted: Bool, memberAfterInsert: ConcreteElement) { let (inserted, memberAfterInsert) = _concreteElement_insert(AnyHashable(newMember) as! Element) return ( inserted: inserted, memberAfterInsert: memberAfterInsert.base as! ConcreteElement) } @discardableResult public mutating func update( with newMember: ConcreteElement ) -> ConcreteElement? { return _concreteElement_update(with: AnyHashable(newMember)) .map { $0.base as! ConcreteElement } } @discardableResult public mutating func remove( _ member: ConcreteElement ) -> ConcreteElement? { return _concreteElement_remove(AnyHashable(member)) .map { $0.base as! ConcreteElement } } } //===----------------------------------------------------------------------===// // Convenience APIs for Dictionary //===----------------------------------------------------------------------===// // FIXME(ABI)#38 (Overload resolution): remove these trampolines when extensions below can be // properly expressed in the language. extension Dictionary { internal subscript(_concreteKey key: Key) -> Value? { @inline(__always) get { return self[key] } @inline(__always) set(newValue) { self[key] = newValue } } @inline(__always) internal mutating func _concreteKey_updateValue( _ value: Value, forKey key: Key ) -> Value? { return updateValue(value, forKey: key) } @inline(__always) internal mutating func _concreteKey_removeValue(forKey key: Key) -> Value? { return removeValue(forKey: key) } } 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()] } set { self[_concreteKey: key._toAnyHashable()] = newValue } } @discardableResult public mutating func updateValue( _ value: Value, forKey key: ConcreteKey ) -> Value? { return _concreteKey_updateValue(value, forKey: AnyHashable(key)) } @discardableResult public mutating func removeValue( forKey key: ConcreteKey ) -> Value? { return _concreteKey_removeValue(forKey: AnyHashable(key)) } }