mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
This avoids indirection by making calls directly to the C implementations which prevents potentials of mismatched intent or changes of calling convention of @_silgen. The added benefit is that all of the shims in this case are no longer visible symbols (anyone using them was not authorized out side of the Foundation overlay). Also the callout methods in the headers now all share similar naming shcemes for easier refactoring and searching in the style of __NS<class><action> style. The previous compiled C/Objective-C source files were built with MRR the new headers MUST be ARC by Swift import rules. The one caveat is that certain functions MUST avoid the bridge case (since they are part of the bridging code-paths and that would incur a recursive potential) which have the types erased up to NSObject * via the macro NS_NON_BRIDGED. The remaining @_silgen declarations are either swift functions exposed externally to the rest of Swift’s runtime or are included in NSNumber.gyb which the Foundation team has other plans for removing those @_silgen functions at a later date and Data.swift has one external function left with @_silgen which is blocked by a bug in the compiler which seems to improperly import that particular method as an inline c function.
166 lines
5.5 KiB
Swift
166 lines
5.5 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
@_exported import Foundation // Clang module
|
|
import Darwin.uuid
|
|
import _SwiftCoreFoundationOverlayShims
|
|
|
|
/// Represents UUID strings, which can be used to uniquely identify types, interfaces, and other items.
|
|
@available(OSX 10.8, iOS 6.0, *)
|
|
public struct UUID : ReferenceConvertible, Hashable, Equatable, CustomStringConvertible {
|
|
public typealias ReferenceType = NSUUID
|
|
|
|
public private(set) var uuid: uuid_t = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
|
|
/* Create a new UUID with RFC 4122 version 4 random bytes */
|
|
public init() {
|
|
withUnsafeMutablePointer(to: &uuid) {
|
|
$0.withMemoryRebound(to: UInt8.self, capacity: 16) {
|
|
uuid_generate_random($0)
|
|
}
|
|
}
|
|
}
|
|
|
|
fileprivate init(reference: NSUUID) {
|
|
var bytes: uuid_t = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
withUnsafeMutablePointer(to: &bytes) {
|
|
$0.withMemoryRebound(to: UInt8.self, capacity: 16) {
|
|
reference.getBytes($0)
|
|
}
|
|
}
|
|
uuid = bytes
|
|
}
|
|
|
|
/// Create a UUID from a string such as "E621E1F8-C36C-495A-93FC-0C247A3E6E5F".
|
|
///
|
|
/// Returns nil for invalid strings.
|
|
public init?(uuidString string: String) {
|
|
let res = withUnsafeMutablePointer(to: &uuid) {
|
|
$0.withMemoryRebound(to: UInt8.self, capacity: 16) {
|
|
return uuid_parse(string, $0)
|
|
}
|
|
}
|
|
if res != 0 {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
/// Create a UUID from a `uuid_t`.
|
|
public init(uuid: uuid_t) {
|
|
self.uuid = uuid
|
|
}
|
|
|
|
/// Returns a string created from the UUID, such as "E621E1F8-C36C-495A-93FC-0C247A3E6E5F"
|
|
public var uuidString: String {
|
|
var bytes: uuid_string_t = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
var localValue = uuid
|
|
return withUnsafeMutablePointer(to: &localValue) {
|
|
$0.withMemoryRebound(to: UInt8.self, capacity: 16) { val in
|
|
withUnsafeMutablePointer(to: &bytes) {
|
|
$0.withMemoryRebound(to: Int8.self, capacity: 37) { str in
|
|
uuid_unparse(val, str)
|
|
return String(cString: UnsafePointer(str), encoding: .utf8)!
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public var hashValue: Int {
|
|
var localValue = uuid
|
|
return withUnsafeMutablePointer(to: &localValue) {
|
|
$0.withMemoryRebound(to: UInt8.self, capacity: 16) {
|
|
return Int(bitPattern: CFHashBytes($0, CFIndex(MemoryLayout<uuid_t>.size)))
|
|
}
|
|
}
|
|
}
|
|
|
|
public var description: String {
|
|
return uuidString
|
|
}
|
|
|
|
public var debugDescription: String {
|
|
return description
|
|
}
|
|
|
|
// MARK: - Bridging Support
|
|
|
|
fileprivate var reference: NSUUID {
|
|
var bytes = uuid
|
|
return withUnsafePointer(to: &bytes) {
|
|
$0.withMemoryRebound(to: UInt8.self, capacity: 16) {
|
|
return NSUUID(uuidBytes: $0)
|
|
}
|
|
}
|
|
}
|
|
|
|
public static func ==(lhs: UUID, rhs: UUID) -> Bool {
|
|
return lhs.uuid.0 == rhs.uuid.0 &&
|
|
lhs.uuid.1 == rhs.uuid.1 &&
|
|
lhs.uuid.2 == rhs.uuid.2 &&
|
|
lhs.uuid.3 == rhs.uuid.3 &&
|
|
lhs.uuid.4 == rhs.uuid.4 &&
|
|
lhs.uuid.5 == rhs.uuid.5 &&
|
|
lhs.uuid.6 == rhs.uuid.6 &&
|
|
lhs.uuid.7 == rhs.uuid.7 &&
|
|
lhs.uuid.8 == rhs.uuid.8 &&
|
|
lhs.uuid.9 == rhs.uuid.9 &&
|
|
lhs.uuid.10 == rhs.uuid.10 &&
|
|
lhs.uuid.11 == rhs.uuid.11 &&
|
|
lhs.uuid.12 == rhs.uuid.12 &&
|
|
lhs.uuid.13 == rhs.uuid.13 &&
|
|
lhs.uuid.14 == rhs.uuid.14 &&
|
|
lhs.uuid.15 == rhs.uuid.15
|
|
}
|
|
}
|
|
|
|
extension UUID : CustomReflectable {
|
|
public var customMirror: Mirror {
|
|
let c : [(label: String?, value: Any)] = []
|
|
let m = Mirror(self, children:c, displayStyle: Mirror.DisplayStyle.struct)
|
|
return m
|
|
}
|
|
}
|
|
|
|
extension UUID : _ObjectiveCBridgeable {
|
|
@_semantics("convertToObjectiveC")
|
|
public func _bridgeToObjectiveC() -> NSUUID {
|
|
return reference
|
|
}
|
|
|
|
public static func _forceBridgeFromObjectiveC(_ x: NSUUID, result: inout UUID?) {
|
|
if !_conditionallyBridgeFromObjectiveC(x, result: &result) {
|
|
fatalError("Unable to bridge \(_ObjectiveCType.self) to \(self)")
|
|
}
|
|
}
|
|
|
|
public static func _conditionallyBridgeFromObjectiveC(_ input: NSUUID, result: inout UUID?) -> Bool {
|
|
result = UUID(reference: input)
|
|
return true
|
|
}
|
|
|
|
public static func _unconditionallyBridgeFromObjectiveC(_ source: NSUUID?) -> UUID {
|
|
var result: UUID?
|
|
_forceBridgeFromObjectiveC(source!, result: &result)
|
|
return result!
|
|
}
|
|
}
|
|
|
|
extension NSUUID : _HasCustomAnyHashableRepresentation {
|
|
// Must be @nonobjc to avoid infinite recursion during bridging.
|
|
@nonobjc
|
|
public func _toCustomAnyHashable() -> AnyHashable? {
|
|
return AnyHashable(self as UUID)
|
|
}
|
|
}
|
|
|