// 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
//

import CoreFoundation

extension CFKeyedArchiverUID : _NSBridgeable {
    typealias NSType = _NSKeyedArchiverUID
    
    internal var _nsObject: NSType { return unsafeBitCast(self, to: NSType.self) }
}

internal class _NSKeyedArchiverUID : NSObject {
    typealias CFType = CFKeyedArchiverUID
    internal var _base = _CFInfo(typeID: _CFKeyedArchiverUIDGetTypeID())
    internal var value : UInt32 = 0
    
    internal var _cfObject : CFType {
        return unsafeBitCast(self, to: CFType.self)
    }
    
    override open var _cfTypeID: CFTypeID {
        return _CFKeyedArchiverUIDGetTypeID()
    }

    open override var hash: Int {
        return Int(bitPattern: CFHash(_cfObject as CFTypeRef!))
    }
    
    open override func isEqual(_ object: Any?) -> Bool {
        // no need to compare these?
        return false
    }
    
    init(value : UInt32) {
        self.value = value
    }
    
    deinit {
        _CFDeinit(self)
    }
}

// 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
//

import CoreFoundation

extension CFKeyedArchiverUID : _NSBridgeable {
    typealias NSType = _NSKeyedArchiverUID
    
    internal var _nsObject: NSType { return unsafeBitCast(self, to: NSType.self) }
}

internal class _NSKeyedArchiverUID : NSObject {
    typealias CFType = CFKeyedArchiverUID
    internal var _base = _CFInfo(typeID: _CFKeyedArchiverUIDGetTypeID())
    internal var value : UInt32 = 0
    
    internal var _cfObject : CFType {
        return unsafeBitCast(self, to: CFType.self)
    }
    
    override open var _cfTypeID: CFTypeID {
        return _CFKeyedArchiverUIDGetTypeID()
    }

    open override var hash: Int {
        return Int(bitPattern: CFHash(_cfObject as CFTypeRef?))
    }
    
    open override func isEqual(_ object: Any?) -> Bool {
        // no need to compare these?
        return false
    }
    
    init(value : UInt32) {
        self.value = value
    }
    
    deinit {
        _CFDeinit(self)
    }
}

Fix cast that is disallowed by SE-0054.
Fix cast that is disallowed by SE-0054.

SE-0054 (Abolish ImplicitlyUnwrappedOptionalType) substantially reduced
the number of places that '!' can be used, but the implementation missed
certain cases like this one. That implementation is being overhauled to
catch all the illegal cases.
