mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
1048 lines
43 KiB
Swift
1048 lines
43 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
// Exposes advanced properties of Unicode.Scalar defined by the Unicode
|
|
// Standard.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
import SwiftShims
|
|
|
|
extension Unicode.Scalar {
|
|
|
|
/// A value that provides access to properties of a Unicode scalar that are
|
|
/// defined by the Unicode standard.
|
|
public struct Properties {
|
|
internal init(_value: UInt32) {
|
|
// We convert the value to the underlying UChar32 type here and store it
|
|
// in that form to make calling the ICU APIs cleaner below.
|
|
self._value = __swift_stdlib_UChar32(bitPattern: _value)
|
|
}
|
|
|
|
internal var _value: __swift_stdlib_UChar32
|
|
}
|
|
|
|
/// A value that provides access to properties of the Unicode scalar that are
|
|
/// defined by the Unicode standard.
|
|
public var properties: Properties {
|
|
return Properties(_value: _value)
|
|
}
|
|
}
|
|
|
|
/// Boolean properties that are defined by the Unicode Standard (i.e., not
|
|
/// ICU-specific).
|
|
extension Unicode.Scalar.Properties {
|
|
|
|
@_transparent
|
|
internal func _hasBinaryProperty(
|
|
_ property: __swift_stdlib_UProperty
|
|
) -> Bool {
|
|
return __swift_stdlib_u_hasBinaryProperty(_value, property) != 0
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is alphabetic.
|
|
///
|
|
/// Alphabetic scalars are the primary units of alphabets and/or syllabaries.
|
|
///
|
|
/// This property corresponds to the `Alphabetic` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isAlphabetic: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_ALPHABETIC)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is an ASCII character
|
|
/// commonly used for the representation of hexadecimal numbers.
|
|
///
|
|
/// The only scalars for which this property is true are:
|
|
///
|
|
/// * U+0030...U+0039: DIGIT ZERO...DIGIT NINE
|
|
/// * U+0041...U+0046: LATIN CAPITAL LETTER A...LATIN CAPITAL LETTER F
|
|
/// * U+0061...U+0066: LATIN SMALL LETTER A...LATIN SMALL LETTER F
|
|
///
|
|
/// This property corresponds to the `ASCII_Hex_Digit` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isASCIIHexDigit: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_ASCII_HEX_DIGIT)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a format control
|
|
/// character that has a specific function in the Unicode Bidrectional
|
|
/// Algorithm.
|
|
///
|
|
/// This property corresponds to the `Bidi_Control` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isBidiControl: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_BIDI_CONTROL)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is mirrored in
|
|
/// bidirectional text.
|
|
///
|
|
/// This property corresponds to the `Bidi_Mirrored` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isBidiMirrored: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_BIDI_MIRRORED)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a punctuation
|
|
/// symbol explicitly called out as a dash in the Unicode Standard or a
|
|
/// compatibility equivalent.
|
|
///
|
|
/// This property corresponds to the `Dash` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isDash: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_DASH)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a default-ignorable
|
|
/// code point.
|
|
///
|
|
/// Default-ignorable code points are those that should be ignored by default
|
|
/// in rendering (unless explicitly supported). They have no visible glyph or
|
|
/// advance width in and of themselves, although they may affect the display,
|
|
/// positioning, or adornment of adjacent or surrounding characters.
|
|
///
|
|
/// This property corresponds to the `Default_Ignorable_Code_Point` property
|
|
/// in the [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isDefaultIgnorableCodePoint: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_DEFAULT_IGNORABLE_CODE_POINT)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is deprecated.
|
|
///
|
|
/// Scalars are never removed from the Unicode Standard, but the usage of
|
|
/// deprecated scalars is strongly discouraged.
|
|
///
|
|
/// This property corresponds to the `Deprecated` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isDeprecated: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_DEPRECATED)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a diacritic.
|
|
///
|
|
/// Diacritics are scalars that linguistically modify the meaning of another
|
|
/// scalar to which they apply. Scalars for which this property is true are
|
|
/// frequently, but not always, combining marks or modifiers.
|
|
///
|
|
/// This property corresponds to the `Diacritic` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isDiacritic: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_DIACRITIC)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar's principal function is
|
|
/// to extend the value or shape of a preceding alphabetic scalar.
|
|
///
|
|
/// Typical extenders are length and iteration marks.
|
|
///
|
|
/// This property corresponds to the `Extender` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isExtender: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_EXTENDER)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is excluded from
|
|
/// composition when performing Unicode normalization.
|
|
///
|
|
/// This property corresponds to the `Full_Composition_Exclusion` property in
|
|
/// the [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isFullCompositionExclusion: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_FULL_COMPOSITION_EXCLUSION)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a grapheme base.
|
|
///
|
|
/// A grapheme base can be thought of as a space-occupying glyph above or
|
|
/// below which other non-spacing modifying glyphs can be applied. For
|
|
/// example, when the character `é` is represented in NFD form, the grapheme
|
|
/// base is "e" (U+0065 LATIN SMALL LETTER E) and it is followed by a single
|
|
/// grapheme extender, U+0301 COMBINING ACUTE ACCENT.
|
|
///
|
|
/// The set of scalars for which `isGraphemeBase` is true is disjoint by
|
|
/// definition from the set for which `isGraphemeExtend` is true.
|
|
///
|
|
/// This property corresponds to the `Grapheme_Base` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isGraphemeBase: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_GRAPHEME_BASE)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a grapheme extender.
|
|
///
|
|
/// A grapheme extender can be thought of primarily as a non-spacing glyph
|
|
/// that is applied above or below another glyph.
|
|
///
|
|
/// The set of scalars for which `isGraphemeExtend` is true is disjoint by
|
|
/// definition from the set for which `isGraphemeBase` is true.
|
|
///
|
|
/// This property corresponds to the `Grapheme_Extend` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isGraphemeExtend: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_GRAPHEME_EXTEND)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one that is commonly
|
|
/// used for the representation of hexadecimal numbers or a compatibility
|
|
/// equivalent.
|
|
///
|
|
/// This property is true for all scalars for which `isASCIIHexDigit` is true
|
|
/// as well as for their CJK halfwidth and fullwidth variants.
|
|
///
|
|
/// This property corresponds to the `Hex_Digit` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isHexDigit: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_HEX_DIGIT)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one which is
|
|
/// recommended to be allowed to appear in a non-starting position in a
|
|
/// programming language identifier.
|
|
///
|
|
/// Applications that store identifiers in NFKC normalized form should instead
|
|
/// use `isXIDContinue` to check whether a scalar is a valid identifier
|
|
/// character.
|
|
///
|
|
/// This property corresponds to the `ID_Continue` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isIDContinue: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_ID_CONTINUE)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one which is
|
|
/// recommended to be allowed to appear in a starting position in a
|
|
/// programming language identifier.
|
|
///
|
|
/// Applications that store identifiers in NFKC normalized form should instead
|
|
/// use `isXIDStart` to check whether a scalar is a valid identifier
|
|
/// character.
|
|
///
|
|
/// This property corresponds to the `ID_Start` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isIDStart: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_ID_START)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is considered to be a
|
|
/// CJKV (Chinese, Japanese, Korean, and Vietnamese) or other siniform
|
|
/// (Chinese writing-related) ideograph.
|
|
///
|
|
/// This property roughly defines the class of "Chinese characters" and does
|
|
/// not include characters of other logographic scripts such as Cuneiform or
|
|
/// Egyptian Hieroglyphs
|
|
///
|
|
/// This property corresponds to the `Ideographic` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isIdeographic: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_IDEOGRAPHIC)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is an ideographic
|
|
/// description character that determines how the two ideographic characters
|
|
/// or ideographic description sequences that follow it are to be combined to
|
|
/// form a single character.
|
|
///
|
|
/// Ideographic description characters are technically printable characters,
|
|
/// but advanced rendering engines may use them to approximate ideographs that
|
|
/// are otherwise unrepresentable.
|
|
///
|
|
/// This property corresponds to the `IDS_Binary_Operator` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isIDSBinaryOperator: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_IDS_BINARY_OPERATOR)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is an ideographic
|
|
/// description character that determines how the three ideographic characters
|
|
/// or ideographic description sequences that follow it are to be combined to
|
|
/// form a single character.
|
|
///
|
|
/// Ideographic description characters are technically printable characters,
|
|
/// but advanced rendering engines may use them to approximate ideographs that
|
|
/// are otherwise unrepresentable.
|
|
///
|
|
/// This property corresponds to the `IDS_Trinary_Operator` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isIDSTrinaryOperator: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_IDS_TRINARY_OPERATOR)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a format control
|
|
/// character that has a specific function in controlling cursive joining and
|
|
/// ligation.
|
|
///
|
|
/// There are two scalars for which this property is true:
|
|
///
|
|
/// * When U+200C ZERO WIDTH NON-JOINER is inserted between two characters, it
|
|
/// directs the rendering engine to render them separately/disconnected when
|
|
/// it might otherwise render them as a ligature. For example, a rendering
|
|
/// engine might display "fl" in English as a connected glyph; inserting the
|
|
/// zero width non-joiner would force them to be rendered as disconnected
|
|
/// glyphs.
|
|
///
|
|
/// * When U+200D ZERO WIDTH JOINER is inserted between two characters, it
|
|
/// directs the rendering engine to render them as a connected glyph when it
|
|
/// would otherwise render them independently. The zero width joiner is also
|
|
/// used to construct complex emoji from sequences of base emoji characters.
|
|
/// For example, "family" emoji are created by joining sequences of man,
|
|
/// woman, and child emoji with the zero width joiner.
|
|
///
|
|
/// This property corresponds to the `Join_Control` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isJoinControl: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_JOIN_CONTROL)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar requires special handling
|
|
/// for operations involving ordering, such as sorting and searching.
|
|
///
|
|
/// This property applies to a small number of spacing vowel letters occurring
|
|
/// in some Southeast Asian scripts like Thai and Lao, which use a visual
|
|
/// order display model. Such letters are stored in text ahead of
|
|
/// syllable-initial consonants.
|
|
///
|
|
/// This property corresponds to the `Logical_Order_Exception` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isLogicalOrderException: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_LOGICAL_ORDER_EXCEPTION)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar's letterform is
|
|
/// considered lowercase.
|
|
///
|
|
/// This property corresponds to the `Lowercase` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isLowercase: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_LOWERCASE)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one that naturally
|
|
/// appears in mathematical contexts.
|
|
///
|
|
/// The set of scalars for which this property is true includes mathematical
|
|
/// operators and symbols as well as specific Greek and Hebrew letter
|
|
/// variants that are categorized as symbols. Notably, it does _not_ contain
|
|
/// the standard digits or Latin/Greek letter blocks; instead, it contains the
|
|
/// mathematical Latin, Greek, and Arabic letters and numbers defined in the
|
|
/// Supplemental Multilingual Plane.
|
|
///
|
|
/// This property corresponds to the `Math` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isMath: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_MATH)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is permanently reserved
|
|
/// for internal use.
|
|
///
|
|
/// This property corresponds to the `Noncharacter_Code_Point` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isNoncharacterCodePoint: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_NONCHARACTER_CODE_POINT)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one that is used in
|
|
/// writing to surround quoted text.
|
|
///
|
|
/// This property corresponds to the `Quotation_Mark` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isQuotationMark: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_QUOTATION_MARK)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a radical component of
|
|
/// CJK characters, Tangut characters, or Yi syllables.
|
|
///
|
|
/// These scalars are often the components of ideographic description
|
|
/// sequences, as defined by the `isIDSBinaryOperator` and
|
|
/// `isIDSTrinaryOperator` properties.
|
|
///
|
|
/// This property corresponds to the `Radical` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isRadical: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_RADICAL)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar has a "soft dot" that
|
|
/// disappears when a diacritic is placed over the scalar.
|
|
///
|
|
/// For example, "i" is soft dotted because the dot disappears when adding an
|
|
/// accent mark, as in "í".
|
|
///
|
|
/// This property corresponds to the `Soft_Dotted` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isSoftDotted: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_SOFT_DOTTED)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a punctuation symbol
|
|
/// that typically marks the end of a textual unit.
|
|
///
|
|
/// This property corresponds to the `Terminal_Punctuation` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isTerminalPunctuation: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_TERMINAL_PUNCTUATION)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one of the unified
|
|
/// CJK ideographs in the Unicode Standard.
|
|
///
|
|
/// This property is false for CJK punctuation and symbols, as well as for
|
|
/// compatibility ideographs (which canonically decompose to unified
|
|
/// ideographs).
|
|
///
|
|
/// This property corresponds to the `Unified_Ideograph` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isUnifiedIdeograph: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_UNIFIED_IDEOGRAPH)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar's letterform is
|
|
/// considered uppercase.
|
|
///
|
|
/// This property corresponds to the `Uppercase` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isUppercase: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_UPPERCASE)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a whitespace
|
|
/// character.
|
|
///
|
|
/// This property is true for scalars that are spaces, separator characters,
|
|
/// and other control characters that should be treated as whitespace for the
|
|
/// purposes of parsing text elements.
|
|
///
|
|
/// This property corresponds to the `White_Space` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isWhitespace: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_WHITE_SPACE)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one which is
|
|
/// recommended to be allowed to appear in a non-starting position in a
|
|
/// programming language identifier, with adjustments made for NFKC normalized
|
|
/// form.
|
|
///
|
|
/// The set of scalars `[:XID_Continue:]` closes the set `[:ID_Continue:]`
|
|
/// under NFKC normalization by removing any scalars whose normalized form is
|
|
/// not of the form `[:ID_Continue:]*`.
|
|
///
|
|
/// This property corresponds to the `XID_Continue` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isXIDContinue: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_XID_CONTINUE)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one which is
|
|
/// recommended to be allowed to appear in a starting position in a
|
|
/// programming language identifier, with adjustments made for NFKC normalized
|
|
/// form.
|
|
///
|
|
/// The set of scalars `[:XID_Start:]` closes the set `[:ID_Start:]` under
|
|
/// NFKC normalization by removing any scalars whose normalized form is not of
|
|
/// the form `[:ID_Start:] [:ID_Continue:]*`.
|
|
///
|
|
/// This property corresponds to the `XID_Start` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isXIDStart: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_XID_START)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a punctuation mark
|
|
/// that generally marks the end of a sentence.
|
|
///
|
|
/// This property corresponds to the `Sentence_Terminal` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isSentenceTerminal: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_S_TERM)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is a variation selector.
|
|
///
|
|
/// Variation selectors allow rendering engines that support them to choose
|
|
/// different glyphs to display for a particular code point.
|
|
///
|
|
/// This property corresponds to the `Variation_Selector` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isVariationSelector: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_VARIATION_SELECTOR)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is recommended to have
|
|
/// syntactic usage in patterns represented in source code.
|
|
///
|
|
/// This property corresponds to the `Pattern_Syntax` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isPatternSyntax: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_PATTERN_SYNTAX)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is recommended to be
|
|
/// treated as whitespace when parsing patterns represented in source code.
|
|
///
|
|
/// This property corresponds to the `Pattern_White_Space` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isPatternWhitespace: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_PATTERN_WHITE_SPACE)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is considered to be
|
|
/// either lowercase, uppercase, or titlecase.
|
|
///
|
|
/// Though similar in name, this property is _not_ equivalent to
|
|
/// `changesWhenCaseMapped`. The set of scalars for which `isCased` is true is
|
|
/// a superset of those for which `changesWhenCaseMapped` is true. An example
|
|
/// of scalars that only have `isCased` as true are the Latin small capitals
|
|
/// that are used by the International Phonetic Alphabet. These letters have a
|
|
/// case but do not change when they are mapped to any of the other cases.
|
|
///
|
|
/// This property corresponds to the `Cased` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isCased: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_CASED)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is ignored for casing
|
|
/// purposes.
|
|
///
|
|
/// This property corresponds to the `Case_Ignorable` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isCaseIgnorable: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_CASE_IGNORABLE)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one whose normalized
|
|
/// form is not stable under a `toLowercase` mapping.
|
|
///
|
|
/// This property corresponds to the `Changes_When_Lowercased` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var changesWhenLowercased: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_CHANGES_WHEN_LOWERCASED)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one whose normalized
|
|
/// form is not stable under a `toUppercase` mapping.
|
|
///
|
|
/// This property corresponds to the `Changes_When_Uppercased` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var changesWhenUppercased: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_CHANGES_WHEN_UPPERCASED)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one whose normalized
|
|
/// form is not stable under a `toTitlecase` mapping.
|
|
///
|
|
/// This property corresponds to the `Changes_When_Titlecased` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var changesWhenTitlecased: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_CHANGES_WHEN_TITLECASED)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one whose normalized
|
|
/// form is not stable under case folding.
|
|
///
|
|
/// This property corresponds to the `Changes_When_Casefolded` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var changesWhenCaseFolded: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_CHANGES_WHEN_CASEFOLDED)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar may change when it
|
|
/// undergoes a case mapping.
|
|
///
|
|
/// For any scalar `s`, it holds by definition that
|
|
///
|
|
/// ```
|
|
/// s.changesWhenCaseMapped = s.changesWhenLowercased ||
|
|
/// s.changesWhenUppercased ||
|
|
/// s.changesWhenTitlecased
|
|
/// ```
|
|
///
|
|
/// This property corresponds to the `Changes_When_Casemapped` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var changesWhenCaseMapped: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_CHANGES_WHEN_CASEMAPPED)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one that is not
|
|
/// identical to its NFKC case-fold mapping.
|
|
///
|
|
/// This property corresponds to the `Changes_When_NFKC_Casefolded` property
|
|
/// in the [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var changesWhenNFKCCaseFolded: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_CHANGES_WHEN_NFKC_CASEFOLDED)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar has an emoji
|
|
/// presentation, whether or not it is the default.
|
|
///
|
|
/// This property is true for scalars that are rendered as emoji by default
|
|
/// and also for scalars that have a non-default emoji rendering when followed
|
|
/// by U+FE0F VARIATION SELECTOR-16. This includes some scalars that are not
|
|
/// typically considered to be emoji:
|
|
///
|
|
/// ```
|
|
/// let sunglasses: Unicode.Scalar = "😎"
|
|
/// let dollar: Unicode.Scalar = "$"
|
|
/// let zero: Unicode.Scalar = "0"
|
|
///
|
|
/// print(sunglasses.isEmoji)
|
|
/// // Prints "true"
|
|
/// print(dollar.isEmoji)
|
|
/// // Prints "false"
|
|
/// print(zero.isEmoji)
|
|
/// // Prints "true"
|
|
/// ```
|
|
///
|
|
/// The final result is true because the ASCII digits have non-default emoji
|
|
/// presentations; some platforms render these with an alternate appearance.
|
|
///
|
|
/// Because of this behavior, testing `isEmoji` alone on a single scalar is
|
|
/// insufficient to determine if a unit of text is rendered as an emoji; a
|
|
/// correct test requires inspecting multiple scalars in a `Character`. In
|
|
/// addition to checking whether the base scalar has `isEmoji == true`, you
|
|
/// must also check its default presentation (see `isEmojiPresentation`) and
|
|
/// determine whether it is followed by a variation selector that would modify
|
|
/// the presentation.
|
|
///
|
|
/// This property corresponds to the `Emoji` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isEmoji: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_EMOJI)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one that should be
|
|
/// rendered with an emoji presentation, rather than a text presentation, by
|
|
/// default.
|
|
///
|
|
/// Scalars that have emoji presentation by default can be followed by
|
|
/// U+FE0E VARIATION SELECTOR-15 to request the text presentation of the
|
|
/// scalar instead. Likewise, scalars that default to text presentation can
|
|
/// be followed by U+FE0F VARIATION SELECTOR-16 to request the emoji
|
|
/// presentation.
|
|
///
|
|
/// This property corresponds to the `Emoji_Presentation` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isEmojiPresentation: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_EMOJI_PRESENTATION)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one that can modify
|
|
/// a base emoji that precedes it.
|
|
///
|
|
/// The Fitzpatrick skin types are examples of emoji modifiers; they change
|
|
/// the appearance of the preceding emoji base (that is, a scalar for which
|
|
/// `isEmojiModifierBase` is true) by rendering it with a different skin tone.
|
|
///
|
|
/// This property corresponds to the `Emoji_Modifier` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isEmojiModifier: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_EMOJI_MODIFIER)
|
|
}
|
|
|
|
/// A Boolean property indicating whether the scalar is one whose appearance
|
|
/// can be changed by an emoji modifier that follows it.
|
|
///
|
|
/// This property corresponds to the `Emoji_Modifier_Base` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var isEmojiModifierBase: Bool {
|
|
return _hasBinaryProperty(__swift_stdlib_UCHAR_EMOJI_MODIFIER_BASE)
|
|
}
|
|
}
|
|
|
|
extension Unicode {
|
|
|
|
/// A version of the Unicode Standard represented by its `major.minor`
|
|
/// components.
|
|
public typealias Version = (major: Int, minor: Int)
|
|
}
|
|
|
|
extension Unicode.Scalar.Properties {
|
|
|
|
/// The earliest version of the Unicode Standard in which the scalar was
|
|
/// assigned.
|
|
///
|
|
/// This value will be nil for code points that have not yet been assigned.
|
|
///
|
|
/// This property corresponds to the `Age` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var age: Unicode.Version? {
|
|
var versionInfo: __swift_stdlib_UVersionInfo = (0, 0, 0, 0)
|
|
withUnsafeMutablePointer(to: &versionInfo.0) { versionInfoPointer in
|
|
__swift_stdlib_u_charAge(_value, versionInfoPointer)
|
|
}
|
|
guard versionInfo.0 != 0 else { return nil }
|
|
return (major: Int(versionInfo.0), Int(versionInfo.1))
|
|
}
|
|
}
|
|
|
|
extension Unicode {
|
|
|
|
/// The most general classification of a Unicode scalar.
|
|
///
|
|
/// The general category of a scalar is its "first-order, most usual
|
|
/// categorization". It does not attempt to cover multiple uses of some
|
|
/// scalars, such as the use of letters to represent Roman numerals.
|
|
public enum GeneralCategory {
|
|
|
|
/// An uppercase letter.
|
|
///
|
|
/// This value corresponds to the category `Uppercase_Letter` (abbreviated
|
|
/// `Lu`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case uppercaseLetter
|
|
|
|
/// A lowercase letter.
|
|
///
|
|
/// This value corresponds to the category `Lowercase_Letter` (abbreviated
|
|
/// `Ll`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case lowercaseLetter
|
|
|
|
/// A digraph character whose first part is uppercase.
|
|
///
|
|
/// This value corresponds to the category `Titlecase_Letter` (abbreviated
|
|
/// `Lt`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case titlecaseLetter
|
|
|
|
/// A modifier letter.
|
|
///
|
|
/// This value corresponds to the category `Modifier_Letter` (abbreviated
|
|
/// `Lm`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case modifierLetter
|
|
|
|
/// Other letters, including syllables and ideographs.
|
|
///
|
|
/// This value corresponds to the category `Other_Letter` (abbreviated
|
|
/// `Lo`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case otherLetter
|
|
|
|
/// A non-spacing combining mark with zero advance width (abbreviated Mn).
|
|
///
|
|
/// This value corresponds to the category `Nonspacing_Mark` (abbreviated
|
|
/// `Mn`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case nonspacingMark
|
|
|
|
/// A spacing combining mark with positive advance width.
|
|
///
|
|
/// This value corresponds to the category `Spacing_Mark` (abbreviated `Mc`)
|
|
/// in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case spacingMark
|
|
|
|
/// An enclosing combining mark.
|
|
///
|
|
/// This value corresponds to the category `Enclosing_Mark` (abbreviated
|
|
/// `Me`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case enclosingMark
|
|
|
|
/// A decimal digit.
|
|
///
|
|
/// This value corresponds to the category `Decimal_Number` (abbreviated
|
|
/// `Nd`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case decimalNumber
|
|
|
|
/// A letter-like numeric character.
|
|
///
|
|
/// This value corresponds to the category `Letter_Number` (abbreviated
|
|
/// `Nl`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case letterNumber
|
|
|
|
/// A numeric character of another type.
|
|
///
|
|
/// This value corresponds to the category `Other_Number` (abbreviated `No`)
|
|
/// in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case otherNumber
|
|
|
|
/// A connecting punctuation mark, like a tie.
|
|
///
|
|
/// This value corresponds to the category `Connector_Punctuation`
|
|
/// (abbreviated `Pc`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case connectorPunctuation
|
|
|
|
/// A dash or hyphen punctuation mark.
|
|
///
|
|
/// This value corresponds to the category `Dash_Punctuation` (abbreviated
|
|
/// `Pd`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case dashPunctuation
|
|
|
|
/// An opening punctuation mark of a pair.
|
|
///
|
|
/// This value corresponds to the category `Open_Punctuation` (abbreviated
|
|
/// `Ps`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case openPunctuation
|
|
|
|
/// A closing punctuation mark of a pair.
|
|
///
|
|
/// This value corresponds to the category `Close_Punctuation` (abbreviated
|
|
/// `Pe`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case closePunctuation
|
|
|
|
/// An initial quotation mark.
|
|
///
|
|
/// This value corresponds to the category `Initial_Punctuation`
|
|
/// (abbreviated `Pi`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case initialPunctuation
|
|
|
|
/// A final quotation mark.
|
|
///
|
|
/// This value corresponds to the category `Final_Punctuation` (abbreviated
|
|
/// `Pf`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case finalPunctuation
|
|
|
|
/// A punctuation mark of another type.
|
|
///
|
|
/// This value corresponds to the category `Other_Punctuation` (abbreviated
|
|
/// `Po`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case otherPunctuation
|
|
|
|
/// A symbol of mathematical use.
|
|
///
|
|
/// This value corresponds to the category `Math_Symbol` (abbreviated `Sm`)
|
|
/// in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case mathSymbol
|
|
|
|
/// A currency sign.
|
|
///
|
|
/// This value corresponds to the category `Currency_Symbol` (abbreviated
|
|
/// `Sc`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case currencySymbol
|
|
|
|
/// A non-letterlike modifier symbol.
|
|
///
|
|
/// This value corresponds to the category `Modifier_Symbol` (abbreviated
|
|
/// `Sk`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case modifierSymbol
|
|
|
|
/// A symbol of another type.
|
|
///
|
|
/// This value corresponds to the category `Other_Symbol` (abbreviated
|
|
/// `So`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case otherSymbol
|
|
|
|
/// A space character of non-zero width.
|
|
///
|
|
/// This value corresponds to the category `Space_Separator` (abbreviated
|
|
/// `Zs`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case spaceSeparator
|
|
|
|
/// A line separator, which is specifically (and only) U+2028 LINE
|
|
/// SEPARATOR.
|
|
///
|
|
/// This value corresponds to the category `Line_Separator` (abbreviated
|
|
/// `Zl`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case lineSeparator
|
|
|
|
/// A paragraph separator, which is specifically (and only) U+2029 PARAGRAPH
|
|
/// SEPARATOR.
|
|
///
|
|
/// This value corresponds to the category `Paragraph_Separator`
|
|
/// (abbreviated `Zp`) in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case paragraphSeparator
|
|
|
|
/// A C0 or C1 control code.
|
|
///
|
|
/// This value corresponds to the category `Control` (abbreviated `Cc`) in
|
|
/// the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case control
|
|
|
|
/// A format control character.
|
|
///
|
|
/// This value corresponds to the category `Format` (abbreviated `Cf`) in
|
|
/// the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case format
|
|
|
|
/// A surrogate code point.
|
|
///
|
|
/// This value corresponds to the category `Surrogate` (abbreviated `Cs`) in
|
|
/// the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case surrogate
|
|
|
|
/// A private-use character.
|
|
///
|
|
/// This value corresponds to the category `Private_Use` (abbreviated `Co`)
|
|
/// in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case privateUse
|
|
|
|
/// A reserved unassigned code point or a non-character.
|
|
///
|
|
/// This value corresponds to the category `Unassigned` (abbreviated `Cn`)
|
|
/// in the
|
|
/// [Unicode Standard](https://unicode.org/reports/tr44/#General_Category_Values).
|
|
case unassigned
|
|
|
|
internal init(rawValue: __swift_stdlib_UCharCategory) {
|
|
switch rawValue {
|
|
case __swift_stdlib_U_UNASSIGNED: self = .unassigned
|
|
case __swift_stdlib_U_UPPERCASE_LETTER: self = .uppercaseLetter
|
|
case __swift_stdlib_U_LOWERCASE_LETTER: self = .lowercaseLetter
|
|
case __swift_stdlib_U_TITLECASE_LETTER: self = .titlecaseLetter
|
|
case __swift_stdlib_U_MODIFIER_LETTER: self = .modifierLetter
|
|
case __swift_stdlib_U_OTHER_LETTER: self = .otherLetter
|
|
case __swift_stdlib_U_NON_SPACING_MARK: self = .nonspacingMark
|
|
case __swift_stdlib_U_ENCLOSING_MARK: self = .enclosingMark
|
|
case __swift_stdlib_U_COMBINING_SPACING_MARK: self = .spacingMark
|
|
case __swift_stdlib_U_DECIMAL_DIGIT_NUMBER: self = .decimalNumber
|
|
case __swift_stdlib_U_LETTER_NUMBER: self = .letterNumber
|
|
case __swift_stdlib_U_OTHER_NUMBER: self = .otherNumber
|
|
case __swift_stdlib_U_SPACE_SEPARATOR: self = .spaceSeparator
|
|
case __swift_stdlib_U_LINE_SEPARATOR: self = .lineSeparator
|
|
case __swift_stdlib_U_PARAGRAPH_SEPARATOR: self = .paragraphSeparator
|
|
case __swift_stdlib_U_CONTROL_CHAR: self = .control
|
|
case __swift_stdlib_U_FORMAT_CHAR: self = .format
|
|
case __swift_stdlib_U_PRIVATE_USE_CHAR: self = .privateUse
|
|
case __swift_stdlib_U_SURROGATE: self = .surrogate
|
|
case __swift_stdlib_U_DASH_PUNCTUATION: self = .dashPunctuation
|
|
case __swift_stdlib_U_START_PUNCTUATION: self = .openPunctuation
|
|
case __swift_stdlib_U_END_PUNCTUATION: self = .closePunctuation
|
|
case __swift_stdlib_U_CONNECTOR_PUNCTUATION: self = .connectorPunctuation
|
|
case __swift_stdlib_U_OTHER_PUNCTUATION: self = .otherPunctuation
|
|
case __swift_stdlib_U_MATH_SYMBOL: self = .mathSymbol
|
|
case __swift_stdlib_U_CURRENCY_SYMBOL: self = .currencySymbol
|
|
case __swift_stdlib_U_MODIFIER_SYMBOL: self = .modifierSymbol
|
|
case __swift_stdlib_U_OTHER_SYMBOL: self = .otherSymbol
|
|
case __swift_stdlib_U_INITIAL_PUNCTUATION: self = .initialPunctuation
|
|
case __swift_stdlib_U_FINAL_PUNCTUATION: self = .finalPunctuation
|
|
default: fatalError("Unknown general category \(rawValue)")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
extension Unicode.Scalar.Properties {
|
|
|
|
/// The general category (most usual classification) of the scalar.
|
|
///
|
|
/// This property corresponds to the `General_Category` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var generalCategory: Unicode.GeneralCategory {
|
|
let rawValue = __swift_stdlib_UCharCategory(
|
|
UInt32(__swift_stdlib_u_getIntPropertyValue(
|
|
_value, __swift_stdlib_UCHAR_GENERAL_CATEGORY)))
|
|
return Unicode.GeneralCategory(rawValue: rawValue)
|
|
}
|
|
}
|
|
|
|
/// Executes a block that will attempt to store text in the memory owned by the
|
|
/// given string storage object, returning the length of the text.
|
|
///
|
|
/// The closure is assumed to return an `Int32` value (the convention of ICU's C
|
|
/// functions) that is equal to the length of the string being stored. If the
|
|
/// storage object is not large enough to hold the string, it is replaced by one
|
|
/// that is exactly the required size and the closure is executed one more time
|
|
/// to populate it.
|
|
@_inlineable
|
|
@_versioned
|
|
internal func _expandingStorageIfNeeded<
|
|
CodeUnit: UnsignedInteger & FixedWidthInteger
|
|
>(
|
|
_ storage: inout _SwiftStringStorage<CodeUnit>,
|
|
body: (_SwiftStringStorage<CodeUnit>) throws -> Int32
|
|
) rethrows -> Int {
|
|
let z = try body(storage)
|
|
let correctSize = Int(z)
|
|
if correctSize > storage.capacity {
|
|
// If the buffer wasn't large enough, replace it with one that is the
|
|
// correct size and execute the closure again.
|
|
storage = _SwiftStringStorage<CodeUnit>.create(
|
|
capacity: correctSize,
|
|
count: correctSize)
|
|
return Int(try body(storage))
|
|
} else {
|
|
// Otherwise, the buffer has been populated; update its count to the correct
|
|
// value.
|
|
storage.count = correctSize
|
|
return correctSize
|
|
}
|
|
}
|
|
|
|
extension Unicode.Scalar.Properties {
|
|
|
|
internal func _scalarName(
|
|
_ choice: __swift_stdlib_UCharNameChoice
|
|
) -> String? {
|
|
let initialCapacity = 256
|
|
|
|
var storage = _SwiftStringStorage<UTF8.CodeUnit>.create(
|
|
capacity: initialCapacity,
|
|
count: 0)
|
|
var err = __swift_stdlib_U_ZERO_ERROR
|
|
|
|
let correctSize = _expandingStorageIfNeeded(&storage) { storage in
|
|
return storage.start.withMemoryRebound(
|
|
to: Int8.self,
|
|
capacity: storage.capacity
|
|
) { storagePtr in
|
|
err = __swift_stdlib_U_ZERO_ERROR
|
|
return __swift_stdlib_u_charName(
|
|
_value, choice, storagePtr, Int32(storage.capacity), &err)
|
|
}
|
|
}
|
|
|
|
guard err.isSuccess && correctSize > 0 else {
|
|
return nil
|
|
}
|
|
return String(_storage: storage)
|
|
}
|
|
|
|
/// The published name of the scalar.
|
|
///
|
|
/// Some scalars, such as control characters, do not have a value for this
|
|
/// property in the UCD. For such scalars, this property will be nil.
|
|
///
|
|
/// This property corresponds to the `Name` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var name: String? {
|
|
return _scalarName(__swift_stdlib_U_UNICODE_CHAR_NAME)
|
|
}
|
|
|
|
/// The normative formal alias of the scalar, or nil if it has no alias.
|
|
///
|
|
/// The name of a scalar is immutable and never changed in future versions of
|
|
/// the Unicode Standard. The `nameAlias` property is provided to issue
|
|
/// corrections if a name was issued erroneously. For example, the `name` of
|
|
/// U+FE18 is "PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET"
|
|
/// (note that "BRACKET" is misspelled). The `nameAlias` property then
|
|
/// contains the corrected name.
|
|
///
|
|
/// This property corresponds to the `Name_Alias` property in the
|
|
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
|
|
public var nameAlias: String? {
|
|
return _scalarName(__swift_stdlib_U_CHAR_NAME_ALIAS)
|
|
}
|
|
}
|