mirror of
https://github.com/apple/swift-foundation.git
synced 2025-05-17 02:22:10 +08:00
* Provide public access for some internal functions, to enable swift-corelibs-foundation * Add access to TimeZone internals for swift-corelibs-foundation * Fix default TimeZone for Linux * Remove unneeded private entry point * Do not use a recursive definition of description for String.Encoding * Merge in some WASI changes and other Data fixes * Add temporary initializer to the stub URL * Remove Hashable conformance for CocoaError. This allows userInfo to be Any instead of AnyHashable * Remove some protocols which depend on NSError from swift-foundation -- they will live in swift-corelibs-foundation * Adjust the debug description of the GMT ICU calendar to be a little less implementation-specific * Use an English-only description for string encodings, for compatibility with existing SCL-F clients * Use a more compatible definition of a backstop value for Bundle
133 lines
6.2 KiB
Swift
133 lines
6.2 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#if FOUNDATION_FRAMEWORK
|
|
// FIXME: one day this will be bridged from CoreFoundation and we
|
|
// should drop it here. <rdar://problem/14497260> (need support
|
|
// for CF bridging)
|
|
@available(macOS 10.10, iOS 8.0, watchOS 2.0, tvOS 9.0, *)
|
|
public var kCFStringEncodingASCII: CFStringEncoding { return 0x0600 }
|
|
#endif // FOUNDATION_FRAMEWORK
|
|
|
|
@available(macOS 10.10, iOS 8.0, watchOS 2.0, tvOS 9.0, *)
|
|
extension String {
|
|
|
|
public struct Encoding : RawRepresentable, Sendable, Equatable {
|
|
public var rawValue: UInt
|
|
public init(rawValue: UInt) { self.rawValue = rawValue }
|
|
|
|
public static let ascii = Encoding(rawValue: 1)
|
|
public static let nextstep = Encoding(rawValue: 2)
|
|
public static let japaneseEUC = Encoding(rawValue: 3)
|
|
public static let utf8 = Encoding(rawValue: 4)
|
|
public static let isoLatin1 = Encoding(rawValue: 5)
|
|
public static let symbol = Encoding(rawValue: 6)
|
|
public static let nonLossyASCII = Encoding(rawValue: 7)
|
|
public static let shiftJIS = Encoding(rawValue: 8)
|
|
public static let isoLatin2 = Encoding(rawValue: 9)
|
|
public static let unicode = Encoding(rawValue: 10)
|
|
public static let windowsCP1251 = Encoding(rawValue: 11)
|
|
public static let windowsCP1252 = Encoding(rawValue: 12)
|
|
public static let windowsCP1253 = Encoding(rawValue: 13)
|
|
public static let windowsCP1254 = Encoding(rawValue: 14)
|
|
public static let windowsCP1250 = Encoding(rawValue: 15)
|
|
public static let iso2022JP = Encoding(rawValue: 21)
|
|
public static let macOSRoman = Encoding(rawValue: 30)
|
|
public static let utf16 = Encoding.unicode
|
|
public static let utf16BigEndian = Encoding(rawValue: 0x90000100)
|
|
public static let utf16LittleEndian = Encoding(rawValue: 0x94000100)
|
|
public static let utf32 = Encoding(rawValue: 0x8c000100)
|
|
public static let utf32BigEndian = Encoding(rawValue: 0x98000100)
|
|
public static let utf32LittleEndian = Encoding(rawValue: 0x9c000100)
|
|
}
|
|
|
|
// This is a workaround for Clang importer's ambiguous lookup issue since
|
|
// - Swift doesn't allow typealias to nested type
|
|
// - Swift doesn't allow typealias to builtin types like String
|
|
// We therefore rename String.Encoding to String._Encoding for package
|
|
// internal use so we can use `String._Encoding` to disambiguate.
|
|
internal typealias _Encoding = Encoding
|
|
|
|
#if FOUNDATION_FRAMEWORK
|
|
public typealias EncodingConversionOptions = NSString.EncodingConversionOptions
|
|
public typealias EnumerationOptions = NSString.EnumerationOptions
|
|
#endif // FOUNDATION_FRAMEWORK
|
|
}
|
|
|
|
@available(macOS 10.10, iOS 8.0, watchOS 2.0, tvOS 9.0, *)
|
|
extension String.Encoding : Hashable {
|
|
public var hashValue: Int {
|
|
// Note: This is effectively the same hashValue definition that
|
|
// RawRepresentable provides on its own. We only need to keep this to
|
|
// ensure ABI compatibility with 5.0.
|
|
return rawValue.hashValue
|
|
}
|
|
|
|
@_alwaysEmitIntoClient // Introduced in 5.1
|
|
public func hash(into hasher: inout Hasher) {
|
|
// Note: `hash(only:)` is only defined here because we also define
|
|
// `hashValue`.
|
|
//
|
|
// In 5.0, `hash(into:)` was resolved to RawRepresentable's functionally
|
|
// equivalent definition; we added this definition in 5.1 to make it
|
|
// clear this `hash(into:)` isn't synthesized by the compiler.
|
|
// (Otherwise someone may be tempted to define it, possibly breaking the
|
|
// hash encoding and thus the ABI. RawRepresentable's definition is
|
|
// inlinable.)
|
|
hasher.combine(rawValue)
|
|
}
|
|
|
|
public static func ==(lhs: String.Encoding, rhs: String.Encoding) -> Bool {
|
|
// Note: This is effectively the same == definition that
|
|
// RawRepresentable provides on its own. We only need to keep this to
|
|
// ensure ABI compatibility with 5.0.
|
|
return lhs.rawValue == rhs.rawValue
|
|
}
|
|
}
|
|
|
|
@available(macOS 10.10, iOS 8.0, watchOS 2.0, tvOS 9.0, *)
|
|
extension String.Encoding : CustomStringConvertible {
|
|
public var description: String {
|
|
#if FOUNDATION_FRAMEWORK && !NO_LOCALIZATION
|
|
return String.localizedName(of: self)
|
|
#else
|
|
// swift-corelibs-foundation never returned an actually localized name here, but there does exist some test code which depends on these values.
|
|
switch self {
|
|
case .ascii: return "Western (ASCII)"
|
|
case .nextstep: return "Western (NextStep)"
|
|
case .japaneseEUC: return "Japanese (EUC)"
|
|
case .utf8: return "Unicode (UTF-8)"
|
|
case .isoLatin1: return "Western (ISO Latin 1)"
|
|
case .symbol: return "Symbol (Mac OS)"
|
|
case .nonLossyASCII: return "Non-lossy ASCII"
|
|
case .shiftJIS: return "Japanese (Windows, DOS)"
|
|
case .isoLatin2: return "Central European (ISO Latin 2)"
|
|
case .unicode: return "Unicode (UTF-16)"
|
|
case .windowsCP1251: return "Cyrillic (Windows)"
|
|
case .windowsCP1252: return "Western (Windows Latin 1)"
|
|
case .windowsCP1253: return "Greek (Windows)"
|
|
case .windowsCP1254: return "Turkish (Windows Latin 5)"
|
|
case .windowsCP1250: return "Central European (Windows Latin 2)"
|
|
case .iso2022JP: return "Japanese (ISO 2022-JP)"
|
|
case .macOSRoman: return "Western (Mac OS Roman)"
|
|
case .utf16: return "Unicode (UTF-16)"
|
|
case .utf16BigEndian: return "Unicode (UTF-16BE)"
|
|
case .utf16LittleEndian: return "Unicode (UTF-16LE)"
|
|
case .utf32: return "Unicode (UTF-32)"
|
|
case .utf32BigEndian: return "Unicode (UTF-32BE)"
|
|
case .utf32LittleEndian: return "Unicode (UTF-32LE)"
|
|
default: return "\(self.rawValue)"
|
|
}
|
|
#endif
|
|
}
|
|
}
|