| //===--- StringNormalization.swift ----------------------------------------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2018 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 |
| // |
| //===----------------------------------------------------------------------===// |
| |
| import SwiftShims |
| |
| internal enum _Normalization { |
| |
| // ICU's NFC unorm2 instance |
| // |
| // TODO(String performance): Should we cache one on TLS? Is this an expensive |
| // call? |
| internal static var _nfcNormalizer: OpaquePointer = { |
| var err = __swift_stdlib_U_ZERO_ERROR |
| let normalizer = __swift_stdlib_unorm2_getNFCInstance(&err) |
| guard err.isSuccess else { |
| // This shouldn't be possible unless some deep (unrecoverable) system |
| // invariants are violated |
| fatalError("Unable to talk to ICU") |
| } |
| return normalizer |
| }() |
| |
| // When normalized in NFC, some segments may expand in size (e.g. some non-BMP |
| // musical notes). This expansion is capped by the maximum expansion factor of |
| // the normal form. For NFC, that is 3x. |
| internal static let _maxNFCExpansionFactor = 3 |
| } |
| |