@@ -743,50 +743,32 @@ extension Unicode.Scalar.Properties {
743
743
744
744
/// Case mapping properties.
745
745
extension Unicode . Scalar . Properties {
746
- fileprivate enum _CaseMapping : UInt8 {
747
- case uppercase
748
- case lowercase
749
- case titlecase
746
+ fileprivate struct _CaseMapping {
747
+ let rawValue : UInt8
748
+
749
+ static let uppercase = _CaseMapping ( rawValue: 0 )
750
+ static let lowercase = _CaseMapping ( rawValue: 1 )
751
+ static let titlecase = _CaseMapping ( rawValue: 2 )
750
752
}
751
753
752
754
fileprivate func _getMapping( _ mapping: _CaseMapping ) -> String {
753
755
// First, check if our scalar has a special mapping where it's mapped to
754
756
// more than 1 scalar.
755
- let specialMappingPtr = _swift_stdlib_getSpecialMapping ( _scalar. value)
756
-
757
- if let specialMapping = specialMappingPtr {
758
- func readSpecialMapping( _ ptr: UnsafePointer < UInt32 > ) -> String {
759
- let count = Int ( ptr. pointee)
760
-
761
- if count == 0 {
762
- return " \( _scalar) "
763
- }
764
-
765
- var result = " "
766
-
767
- for i in 0 ..< count {
768
- result += " \( Unicode . Scalar ( _unchecked: ptr [ 1 + i] ) ) "
769
- }
757
+ var specialMappingLength = 0
770
758
771
- return result
772
- }
773
-
774
- switch mapping {
775
- case . uppercase:
776
- return readSpecialMapping ( specialMapping)
777
-
778
- case . lowercase:
779
- let upperCount = Int ( specialMapping. pointee)
780
-
781
- return readSpecialMapping ( specialMapping + upperCount + 1 )
759
+ let specialMappingPtr = _swift_stdlib_getSpecialMapping (
760
+ _scalar. value,
761
+ mapping. rawValue,
762
+ & specialMappingLength
763
+ )
782
764
783
- case . titlecase:
784
- let upperCount = Int ( specialMapping. pointee)
785
- let lowerPtr = specialMapping + upperCount + 1
786
- let lowerCount = Int ( lowerPtr. pointee)
765
+ if let specialMapping = specialMappingPtr, specialMappingLength != 0 {
766
+ let buffer = UnsafeBufferPointer < UInt8 > (
767
+ start: specialMapping,
768
+ count: specialMappingLength
769
+ )
787
770
788
- return readSpecialMapping ( lowerPtr + lowerCount + 1 )
789
- }
771
+ return String . _uncheckedFromUTF8 ( buffer, isASCII: false )
790
772
}
791
773
792
774
// If we did not have a special mapping, check if we have a direct scalar
@@ -800,11 +782,11 @@ extension Unicode.Scalar.Properties {
800
782
let scalar = Unicode . Scalar (
801
783
_unchecked: UInt32 ( Int ( _scalar. value) &+ Int ( mappingDistance) )
802
784
)
803
- return " \ ( scalar) "
785
+ return String ( scalar)
804
786
}
805
787
806
788
// We did not have any mapping. Return the scalar as is.
807
- return " \ ( _scalar) "
789
+ return String ( _scalar)
808
790
}
809
791
810
792
/// The lowercase mapping of the scalar.
@@ -867,7 +849,7 @@ extension Unicode.Scalar.Properties {
867
849
/// This property corresponds to the "Age" property in the
868
850
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
869
851
public var age : Unicode . Version ? {
870
- let age = _swift_stdlib_getAge ( _scalar. value)
852
+ let age : UInt16 = _swift_stdlib_getAge ( _scalar. value)
871
853
872
854
if age == . max {
873
855
return nil
@@ -1207,55 +1189,46 @@ extension Unicode.Scalar.Properties {
1207
1189
internal func _fastScalarName( ) -> String ? {
1208
1190
// Define a couple algorithmetic names below.
1209
1191
1192
+ let scalarName = String ( _scalar. value, radix: 16 , uppercase: true )
1193
+
1194
+ switch _scalar. value {
1210
1195
// Hangul Syllable *
1211
- if ( 0xAC00 ... 0xD7A3 ) . contains ( _scalar . value ) {
1196
+ case ( 0xAC00 ... 0xD7A3 ) :
1212
1197
return _hangulName ( )
1213
- }
1214
1198
1215
1199
// Variation Selector-17 through Variation Selector-256
1216
- if ( 0xE0100 ... 0xE01EF ) . contains ( _scalar . value ) {
1200
+ case ( 0xE0100 ... 0xE01EF ) :
1217
1201
return " VARIATION SELECTOR- \( _scalar. value - 0xE0100 + 17 ) "
1218
- }
1219
-
1220
- let scalarName = String ( _scalar. value, radix: 16 , uppercase: true )
1221
1202
1222
- // CJK Unified Ideograph-*
1223
- if ( 0x3400 ... 0x4DBF ) . contains ( _scalar. value) ||
1224
- ( 0x4E00 ... 0x9FFF ) . contains ( _scalar. value) ||
1225
- ( 0x20000 ... 0x2A6DF ) . contains ( _scalar. value) ||
1226
- ( 0x2A700 ... 0x2B738 ) . contains ( _scalar. value) ||
1227
- ( 0x2B740 ... 0x2B81D ) . contains ( _scalar. value) ||
1228
- ( 0x2B820 ... 0x2CEA1 ) . contains ( _scalar. value) ||
1229
- ( 0x2CEB0 ... 0x2EBE0 ) . contains ( _scalar. value) ||
1230
- ( 0x2F800 ... 0x2FA1D ) . contains ( _scalar. value) ||
1231
- ( 0x30000 ... 0x3134A ) . contains ( _scalar. value) {
1203
+ case ( 0x3400 ... 0x4DBF ) ,
1204
+ ( 0x4E00 ... 0x9FFF ) ,
1205
+ ( 0x20000 ... 0x2A6DF ) ,
1206
+ ( 0x2A700 ... 0x2B738 ) ,
1207
+ ( 0x2B740 ... 0x2B81D ) ,
1208
+ ( 0x2B820 ... 0x2CEA1 ) ,
1209
+ ( 0x2CEB0 ... 0x2EBE0 ) ,
1210
+ ( 0x2F800 ... 0x2FA1D ) ,
1211
+ ( 0x30000 ... 0x3134A ) :
1232
1212
return " CJK UNIFIED IDEOGRAPH- \( scalarName) "
1233
- }
1234
1213
1235
- // CJK Compatibility Ideograph-*
1236
- if ( 0xF900 ... 0xFA6D ) . contains ( _scalar. value) ||
1237
- ( 0xFA70 ... 0xFAD9 ) . contains ( _scalar. value) {
1214
+ case ( 0xF900 ... 0xFA6D ) ,
1215
+ ( 0xFA70 ... 0xFAD9 ) :
1238
1216
return " CJK COMPATIBILITY IDEOGRAPH- \( scalarName) "
1239
- }
1240
1217
1241
- // Tangut Ideograph-*
1242
- if ( 0x17000 ... 0x187F7 ) . contains ( _scalar. value) ||
1243
- ( 0x18D00 ... 0x18D08 ) . contains ( _scalar. value) {
1218
+ case ( 0x17000 ... 0x187F7 ) ,
1219
+ ( 0x18D00 ... 0x18D08 ) :
1244
1220
return " TANGUT IDEOGRAPH- \( scalarName) "
1245
- }
1246
1221
1247
- // Khitan Small Script Character-*
1248
- if ( 0x18B00 ... 0x18CD5 ) . contains ( _scalar. value) {
1222
+ case ( 0x18B00 ... 0x18CD5 ) :
1249
1223
return " KHITAN SMALL SCRIPT CHARACTER- \( scalarName) "
1250
- }
1251
1224
1252
- // Nushu Character-*
1253
- if ( 0x1B170 ... 0x1B2FB ) . contains ( _scalar. value) {
1225
+ case ( 0x1B170 ... 0x1B2FB ) :
1254
1226
return " NUSHU CHARACTER- \( scalarName) "
1255
- }
1256
1227
1257
1228
// Otherwise, go look it up.
1258
- return nil
1229
+ default :
1230
+ return nil
1231
+ }
1259
1232
}
1260
1233
1261
1234
/// The published name of the scalar.
@@ -1272,8 +1245,14 @@ extension Unicode.Scalar.Properties {
1272
1245
}
1273
1246
1274
1247
// The longest name that Unicode defines is 88 characters long.
1275
- let name = String ( _uninitializedCapacity: 90 ) { buffer in
1276
- _swift_stdlib_getScalarName ( _scalar. value, buffer. baseAddress)
1248
+ let largestCount = Int ( SWIFT_STDLIB_LARGEST_NAME_COUNT)
1249
+
1250
+ let name = String ( _uninitializedCapacity: largestCount) { buffer in
1251
+ _swift_stdlib_getScalarName (
1252
+ _scalar. value,
1253
+ buffer. baseAddress,
1254
+ buffer. count
1255
+ )
1277
1256
}
1278
1257
1279
1258
return name. isEmpty ? nil : name
@@ -1293,13 +1272,11 @@ extension Unicode.Scalar.Properties {
1293
1272
/// This property corresponds to the "Name_Alias" property in the
1294
1273
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
1295
1274
public var nameAlias : String ? {
1296
- let nameAliasPtr = _swift_stdlib_getNameAlias ( _scalar. value)
1297
-
1298
- guard nameAliasPtr != nil else {
1275
+ guard let nameAliasPtr = _swift_stdlib_getNameAlias ( _scalar. value) else {
1299
1276
return nil
1300
1277
}
1301
1278
1302
- return String ( cString: nameAliasPtr! )
1279
+ return String ( cString: nameAliasPtr)
1303
1280
}
1304
1281
}
1305
1282
@@ -1449,9 +1426,8 @@ extension Unicode.Scalar.Properties {
1449
1426
/// This property corresponds to the "Canonical_Combining_Class" property in
1450
1427
/// the [Unicode Standard](http://www.unicode.org/versions/latest/).
1451
1428
public var canonicalCombiningClass : Unicode . CanonicalCombiningClass {
1452
- let normData = _swift_stdlib_getNormData ( _scalar. value)
1453
- let rawValue = UInt8 ( normData >> 3 )
1454
- return Unicode . CanonicalCombiningClass ( rawValue: rawValue)
1429
+ let normData = Unicode . _NormData ( _scalar)
1430
+ return Unicode . CanonicalCombiningClass ( rawValue: normData. ccc)
1455
1431
}
1456
1432
}
1457
1433
@@ -1498,6 +1474,19 @@ extension Unicode {
1498
1474
/// meet the requirements of `decimal` will have numeric type `numeric`,
1499
1475
/// and programs can treat `digit` and `numeric` equivalently.
1500
1476
case numeric
1477
+
1478
+ internal init ( rawValue: UInt8 ) {
1479
+ switch rawValue {
1480
+ case 0 :
1481
+ self = . numeric
1482
+ case 1 :
1483
+ self = . digit
1484
+ case 2 :
1485
+ self = . decimal
1486
+ default :
1487
+ fatalError ( " Unknown numeric type \( rawValue) " )
1488
+ }
1489
+ }
1501
1490
}
1502
1491
}
1503
1492
@@ -1523,16 +1512,11 @@ extension Unicode.Scalar.Properties {
1523
1512
public var numericType : Unicode . NumericType ? {
1524
1513
let rawValue = _swift_stdlib_getNumericType ( _scalar. value)
1525
1514
1526
- switch rawValue {
1527
- case 0 :
1528
- return . numeric
1529
- case 1 :
1530
- return . digit
1531
- case 2 :
1532
- return . decimal
1533
- default :
1515
+ guard rawValue != . max else {
1534
1516
return nil
1535
1517
}
1518
+
1519
+ return Unicode . NumericType ( rawValue: rawValue)
1536
1520
}
1537
1521
1538
1522
/// The numeric value of the scalar.
0 commit comments