mirror of
https://github.com/apple/swift-foundation.git
synced 2025-05-17 10:47:34 +08:00
74 lines
2.3 KiB
Swift
74 lines
2.3 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2022 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
|
|
@_spi(_Unicode) import Swift
|
|
internal import CoreFoundation_Private.CFString
|
|
#endif // FOUNDATION_FRAMEWORK
|
|
|
|
extension UnicodeScalar {
|
|
func _toHalfWidth() -> Self {
|
|
#if FOUNDATION_FRAMEWORK // TODO: Implement `CFUniCharCompatibilityDecompose` in Swift
|
|
if value >= 0xFF00 && value < 0xFFEF {
|
|
var halfWidth = value
|
|
CFUniCharCompatibilityDecompose(&halfWidth, 1, 1)
|
|
return UnicodeScalar(halfWidth)!
|
|
} else {
|
|
return self
|
|
}
|
|
#else
|
|
fatalError("_toHalfWidth is not implemented yet")
|
|
#endif
|
|
}
|
|
|
|
var _isGraphemeExtend: Bool {
|
|
return BuiltInUnicodeScalarSet.graphemeExtends.contains(self)
|
|
}
|
|
|
|
var _isCanonicalDecomposable: Bool {
|
|
return BuiltInUnicodeScalarSet.canonicalDecomposables.contains(self)
|
|
}
|
|
|
|
func _stripDiacritics() -> Self {
|
|
guard _isCanonicalDecomposable else {
|
|
return self
|
|
}
|
|
|
|
#if FOUNDATION_FRAMEWORK // TODO: Implement `CFUniCharDecomposeCharacter` in Swift
|
|
var stripped: UInt32? = nil
|
|
withUnsafeTemporaryAllocation(of: UTF32Char.self, capacity: 64) { ptr in
|
|
guard let base = ptr.baseAddress else {
|
|
return
|
|
}
|
|
let len = CFUniCharDecomposeCharacter(value, base, ptr.count)
|
|
if len > 0 {
|
|
if ptr[0] < 0x0510 {
|
|
stripped = ptr[0]
|
|
}
|
|
}
|
|
}
|
|
|
|
return stripped != nil ? UnicodeScalar(stripped!)! : self
|
|
#else
|
|
fatalError("_stripDiacritics is not implemented yet")
|
|
#endif // FOUNDATION_FRAMEWORK
|
|
}
|
|
|
|
var _caseFoldMapping : String {
|
|
#if FOUNDATION_FRAMEWORK // TODO: Expose Case Mapping Data without @_spi(_Unicode)
|
|
return self.properties._caseFolded
|
|
#else
|
|
fatalError("_caseFoldMapping is not implemented yet")
|
|
#endif
|
|
}
|
|
}
|