Skip to content

Commit ac6c08f

Browse files
authored
[stdlib] Make the rest of the scalar properties native (#40233)
* Factor out the scalar bit array index mechanism * Implement native numeric scalar properties * Implement native scalar name aliases * Implement native scalar mappings * Implement native scalar names * Implement native scalar age * Implement native scalar general category * Address Michael's and others comments fix special mappings fix bug
1 parent 7c4ad9b commit ac6c08f

23 files changed

+80444
-1078
lines changed

stdlib/public/SwiftShims/UnicodeData.h

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,26 @@
2121
extern "C" {
2222
#endif
2323

24+
#define SWIFT_STDLIB_LARGEST_NAME_COUNT 88
25+
26+
//===----------------------------------------------------------------------===//
27+
// Utilities
28+
//===----------------------------------------------------------------------===//
29+
30+
__swift_intptr_t _swift_stdlib_getMphIdx(__swift_uint32_t scalar,
31+
__swift_intptr_t levels,
32+
const __swift_uint64_t * const *keys,
33+
const __swift_uint16_t * const *ranks,
34+
const __swift_uint16_t * const sizes);
35+
36+
__swift_intptr_t _swift_stdlib_getScalarBitArrayIdx(__swift_uint32_t scalar,
37+
const __swift_uint64_t *bitArrays,
38+
const __swift_uint16_t *ranks);
39+
40+
//===----------------------------------------------------------------------===//
41+
// Normalization
42+
//===----------------------------------------------------------------------===//
43+
2444
SWIFT_RUNTIME_STDLIB_INTERNAL
2545
__swift_uint16_t _swift_stdlib_getNormData(__swift_uint32_t scalar);
2646

@@ -34,19 +54,50 @@ SWIFT_RUNTIME_STDLIB_INTERNAL
3454
__swift_uint32_t _swift_stdlib_getComposition(__swift_uint32_t x,
3555
__swift_uint32_t y);
3656

37-
SWIFT_RUNTIME_STDLIB_INTERNAL
38-
__swift_intptr_t _swift_stdlib_getMphIdx(__swift_uint32_t scalar,
39-
__swift_intptr_t levels,
40-
const __swift_uint64_t * const *keys,
41-
const __swift_uint16_t * const *ranks,
42-
const __swift_uint16_t * const sizes);
57+
//===----------------------------------------------------------------------===//
58+
// Grapheme Breaking
59+
//===----------------------------------------------------------------------===//
60+
4361

4462
SWIFT_RUNTIME_STDLIB_INTERNAL
4563
__swift_uint8_t _swift_stdlib_getGraphemeBreakProperty(__swift_uint32_t scalar);
4664

65+
//===----------------------------------------------------------------------===//
66+
// Unicode.Scalar.Properties
67+
//===----------------------------------------------------------------------===//
68+
4769
SWIFT_RUNTIME_STDLIB_INTERNAL
4870
__swift_uint64_t _swift_stdlib_getBinaryProperties(__swift_uint32_t scalar);
4971

72+
SWIFT_RUNTIME_STDLIB_INTERNAL
73+
__swift_uint8_t _swift_stdlib_getNumericType(__swift_uint32_t scalar);
74+
75+
SWIFT_RUNTIME_STDLIB_INTERNAL
76+
double _swift_stdlib_getNumericValue(__swift_uint32_t scalar);
77+
78+
SWIFT_RUNTIME_STDLIB_INTERNAL
79+
const char *_swift_stdlib_getNameAlias(__swift_uint32_t scalar);
80+
81+
SWIFT_RUNTIME_STDLIB_INTERNAL
82+
__swift_int32_t _swift_stdlib_getMapping(__swift_uint32_t scalar,
83+
__swift_uint8_t mapping);
84+
85+
SWIFT_RUNTIME_STDLIB_INTERNAL
86+
const __swift_uint8_t *_swift_stdlib_getSpecialMapping(__swift_uint32_t scalar,
87+
__swift_uint8_t mapping,
88+
__swift_intptr_t *length);
89+
90+
SWIFT_RUNTIME_STDLIB_INTERNAL
91+
__swift_intptr_t _swift_stdlib_getScalarName(__swift_uint32_t scalar,
92+
__swift_uint8_t *buffer,
93+
__swift_intptr_t capacity);
94+
95+
SWIFT_RUNTIME_STDLIB_INTERNAL
96+
__swift_uint16_t _swift_stdlib_getAge(__swift_uint32_t scalar);
97+
98+
SWIFT_RUNTIME_STDLIB_INTERNAL
99+
__swift_uint8_t _swift_stdlib_getGeneralCategory(__swift_uint32_t scalar);
100+
50101
#ifdef __cplusplus
51102
} // extern "C"
52103
#endif

stdlib/public/SwiftShims/UnicodeShims.h

Lines changed: 0 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,6 @@
2929
extern "C" {
3030
#endif
3131

32-
SWIFT_RUNTIME_STDLIB_API
33-
__swift_int32_t _swift_stdlib_unicode_strToUpper(
34-
__swift_uint16_t *Destination, __swift_int32_t DestinationCapacity,
35-
const __swift_uint16_t *Source, __swift_int32_t SourceLength);
36-
37-
SWIFT_RUNTIME_STDLIB_API
38-
__swift_int32_t _swift_stdlib_unicode_strToLower(
39-
__swift_uint16_t *Destination, __swift_int32_t DestinationCapacity,
40-
const __swift_uint16_t *Source, __swift_int32_t SourceLength);
41-
4232
typedef enum __swift_stdlib_UProperty {
4333
__swift_stdlib_UCHAR_GENERAL_CATEGORY = 0x1005,
4434
__swift_stdlib_UCHAR_NUMERIC_TYPE = 0x1009,
@@ -264,16 +254,6 @@ typedef enum __swift_stdlib_UCharNameChoice {
264254
#endif
265255
} __swift_stdlib_UCharNameChoice;
266256

267-
typedef enum __swift_stdlib_UNumericType {
268-
__swift_stdlib_U_NT_NONE,
269-
__swift_stdlib_U_NT_DECIMAL,
270-
__swift_stdlib_U_NT_DIGIT,
271-
__swift_stdlib_U_NT_NUMERIC,
272-
#ifndef U_HIDE_DEPRECATED_API
273-
__swift_stdlib_U_NT_COUNT
274-
#endif
275-
} __swift_stdlib_UNumericType;
276-
277257
typedef struct __swift_stdlib_UBreakIterator __swift_stdlib_UBreakIterator;
278258
typedef struct __swift_stdlib_UText __swift_stdlib_UText;
279259
typedef __swift_int8_t __swift_stdlib_UBool;
@@ -291,44 +271,6 @@ typedef __swift_uint16_t __swift_stdlib_UChar;
291271
typedef __swift_uint8_t
292272
__swift_stdlib_UVersionInfo[__SWIFT_STDLIB_U_MAX_VERSION_LENGTH];
293273

294-
SWIFT_RUNTIME_STDLIB_API
295-
void __swift_stdlib_u_charAge(
296-
__swift_stdlib_UChar32, __swift_stdlib_UVersionInfo _Nonnull);
297-
298-
SWIFT_RUNTIME_STDLIB_API
299-
__swift_int32_t
300-
__swift_stdlib_u_getIntPropertyValue(__swift_stdlib_UChar32,
301-
__swift_stdlib_UProperty);
302-
303-
SWIFT_RUNTIME_STDLIB_API
304-
__swift_int32_t __swift_stdlib_u_charName(
305-
__swift_stdlib_UChar32 code, __swift_stdlib_UCharNameChoice nameChoice,
306-
char *_Nullable buffer, __swift_int32_t bufferLength,
307-
__swift_stdlib_UErrorCode *pErrorCode);
308-
309-
SWIFT_RUNTIME_STDLIB_API
310-
__swift_int32_t __swift_stdlib_u_strToLower(
311-
__swift_stdlib_UChar *dest, __swift_int32_t destCapacity,
312-
const __swift_stdlib_UChar *src, __swift_int32_t srcLength,
313-
const char *_Nullable locale, __swift_stdlib_UErrorCode *pErrorCode);
314-
315-
SWIFT_RUNTIME_STDLIB_API
316-
__swift_int32_t __swift_stdlib_u_strToTitle(
317-
__swift_stdlib_UChar *dest, __swift_int32_t destCapacity,
318-
const __swift_stdlib_UChar *src, __swift_int32_t srcLength,
319-
__swift_stdlib_UBreakIterator *_Nullable titleIter,
320-
const char *_Nullable locale, __swift_stdlib_UErrorCode *pErrorCode);
321-
322-
SWIFT_RUNTIME_STDLIB_API
323-
__swift_int32_t __swift_stdlib_u_strToUpper(
324-
__swift_stdlib_UChar *dest, __swift_int32_t destCapacity,
325-
const __swift_stdlib_UChar *src, __swift_int32_t srcLength,
326-
const char *_Nullable locale, __swift_stdlib_UErrorCode *pErrorCode);
327-
328-
SWIFT_RUNTIME_STDLIB_API
329-
double __swift_stdlib_u_getNumericValue(__swift_stdlib_UChar32 c);
330-
331-
332274
#ifdef __cplusplus
333275
} // extern "C"
334276
#endif

stdlib/public/core/String.swift

Lines changed: 14 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -849,41 +849,14 @@ extension String {
849849
}
850850
}
851851

852-
// TODO(String performance): Try out incremental case-conversion rather than
853-
// make UTF-16 array beforehand
854-
let codeUnits = Array(self.utf16).withUnsafeBufferPointer {
855-
(uChars: UnsafeBufferPointer<UInt16>) -> Array<UInt16> in
856-
var length: Int = 0
857-
let result = Array<UInt16>(unsafeUninitializedCapacity: uChars.count) {
858-
buffer, initializedCount in
859-
var error = __swift_stdlib_U_ZERO_ERROR
860-
length = Int(truncatingIfNeeded:
861-
__swift_stdlib_u_strToLower(
862-
buffer.baseAddress._unsafelyUnwrappedUnchecked,
863-
Int32(buffer.count),
864-
uChars.baseAddress._unsafelyUnwrappedUnchecked,
865-
Int32(uChars.count),
866-
"",
867-
&error))
868-
initializedCount = min(length, uChars.count)
869-
}
870-
if length > uChars.count {
871-
var error = __swift_stdlib_U_ZERO_ERROR
872-
return Array<UInt16>(unsafeUninitializedCapacity: length) {
873-
buffer, initializedCount in
874-
__swift_stdlib_u_strToLower(
875-
buffer.baseAddress._unsafelyUnwrappedUnchecked,
876-
Int32(buffer.count),
877-
uChars.baseAddress._unsafelyUnwrappedUnchecked,
878-
Int32(uChars.count),
879-
"",
880-
&error)
881-
initializedCount = length
882-
}
883-
}
884-
return result
852+
var result = ""
853+
result.reserveCapacity(utf8.count)
854+
855+
for scalar in unicodeScalars {
856+
result += scalar.properties.lowercaseMapping
885857
}
886-
return codeUnits.withUnsafeBufferPointer { String._uncheckedFromUTF16($0) }
858+
859+
return result
887860
}
888861

889862
/// Returns an uppercase version of the string.
@@ -910,41 +883,14 @@ extension String {
910883
}
911884
}
912885

913-
// TODO(String performance): Try out incremental case-conversion rather than
914-
// make UTF-16 array beforehand
915-
let codeUnits = Array(self.utf16).withUnsafeBufferPointer {
916-
(uChars: UnsafeBufferPointer<UInt16>) -> Array<UInt16> in
917-
var length: Int = 0
918-
let result = Array<UInt16>(unsafeUninitializedCapacity: uChars.count) {
919-
buffer, initializedCount in
920-
var err = __swift_stdlib_U_ZERO_ERROR
921-
length = Int(truncatingIfNeeded:
922-
__swift_stdlib_u_strToUpper(
923-
buffer.baseAddress._unsafelyUnwrappedUnchecked,
924-
Int32(buffer.count),
925-
uChars.baseAddress._unsafelyUnwrappedUnchecked,
926-
Int32(uChars.count),
927-
"",
928-
&err))
929-
initializedCount = min(length, uChars.count)
930-
}
931-
if length > uChars.count {
932-
var err = __swift_stdlib_U_ZERO_ERROR
933-
return Array<UInt16>(unsafeUninitializedCapacity: length) {
934-
buffer, initializedCount in
935-
__swift_stdlib_u_strToUpper(
936-
buffer.baseAddress._unsafelyUnwrappedUnchecked,
937-
Int32(buffer.count),
938-
uChars.baseAddress._unsafelyUnwrappedUnchecked,
939-
Int32(uChars.count),
940-
"",
941-
&err)
942-
initializedCount = length
943-
}
944-
}
945-
return result
886+
var result = ""
887+
result.reserveCapacity(utf8.count)
888+
889+
for scalar in unicodeScalars {
890+
result += scalar.properties.uppercaseMapping
946891
}
947-
return codeUnits.withUnsafeBufferPointer { String._uncheckedFromUTF16($0) }
892+
893+
return result
948894
}
949895

950896
/// Creates an instance from the description of a given

0 commit comments

Comments
 (0)