@@ -281,10 +281,20 @@ public protocol UnicodeDecoder {
281
281
mutating func parseOne< I : IteratorProtocol > (
282
282
_ input: inout I
283
283
) -> Unicode . ParseResult < Encoding . EncodedScalar > where I. Element == Encoding . CodeUnit
284
+ }
285
+
286
+ public protocol _UnicodeEncoding : _UnicodeEncodingBase {
284
287
285
- static func decodeOne( _ content: Encoding . EncodedScalar ) -> UnicodeScalar
288
+ associatedtype ForwardDecoder : UnicodeDecoder
289
+ // where ForwardDecoder.Encoding == Self
290
+
291
+ associatedtype ReverseDecoder : UnicodeDecoder
292
+ // where ReverseDecoder.Encoding == Self
286
293
}
287
294
295
+ protocol UnicodeEncoding : _UnicodeEncoding
296
+ where ForwardDecoder. Encoding == Self , ReverseDecoder. Encoding == Self { }
297
+
288
298
extension UnicodeDecoder {
289
299
@inline ( __always)
290
300
@discardableResult
@@ -300,7 +310,7 @@ extension UnicodeDecoder {
300
310
while true {
301
311
switch d. parseOne ( & input) {
302
312
case let . valid( scalarContent) :
303
- output ( decodeOne ( scalarContent) )
313
+ output ( Encoding . decode ( scalarContent) )
304
314
case . invalid:
305
315
if !makeRepairs { return 1 }
306
316
errors += 1
@@ -364,9 +374,7 @@ extension Unicode.DefaultScalarView : Sequence {
364
374
365
375
extension Unicode . DefaultScalarView . Iterator : IteratorProtocol , Sequence {
366
376
mutating func next( ) -> UnicodeScalar ? {
367
- return parsing. next ( ) . map {
368
- Encoding . ForwardDecoder. decodeOne ( $0)
369
- }
377
+ return parsing. next ( ) . map { Encoding . decode ( $0) }
370
378
}
371
379
}
372
380
@@ -435,7 +443,7 @@ extension Unicode.DefaultScalarView : Collection {
435
443
case . valid( let scalarContent) :
436
444
return Index (
437
445
codeUnitIndex: nextPosition,
438
- scalar: Encoding . ForwardDecoder . decodeOne ( scalarContent) ,
446
+ scalar: Encoding . decode ( scalarContent) ,
439
447
stride: numericCast ( scalarContent. count) )
440
448
case . invalid( let stride) :
441
449
return Index (
@@ -492,7 +500,7 @@ extension Unicode.DefaultScalarView : BidirectionalCollection {
492
500
let d : CodeUnits . IndexDistance = - numericCast( scalarContent. count)
493
501
return Index (
494
502
codeUnitIndex: codeUnits. index ( i. codeUnitIndex, offsetBy: d) ,
495
- scalar: Encoding . ReverseDecoder . decodeOne ( scalarContent) ,
503
+ scalar: Encoding . decode ( scalarContent) ,
496
504
stride: numericCast ( scalarContent. count) )
497
505
case . invalid( let stride) :
498
506
let d : CodeUnits . IndexDistance = - numericCast( stride)
@@ -505,15 +513,6 @@ extension Unicode.DefaultScalarView : BidirectionalCollection {
505
513
}
506
514
}
507
515
508
- public protocol UnicodeEncoding : _UnicodeEncodingBase {
509
-
510
- associatedtype ForwardDecoder : UnicodeDecoder
511
- where ForwardDecoder. Encoding. CodeUnit == CodeUnit
512
-
513
- associatedtype ReverseDecoder : UnicodeDecoder
514
- where ReverseDecoder. Encoding. CodeUnit == CodeUnit
515
- }
516
-
517
516
public protocol _UTFDecoder : UnicodeDecoder
518
517
where Encoding. EncodedScalar == _UIntBuffer < _UInt32 , Encoding . CodeUnit > ,
519
518
_UInt32 == UInt32
@@ -602,8 +601,28 @@ extension Unicode.UTF8 : UnicodeEncoding {
602
601
603
602
public static func _isScalar( _ x: CodeUnit ) -> Bool { return x & 0x80 == 0 }
604
603
605
- public static func decode( _ content: EncodedScalar ) -> UnicodeScalar {
606
- fatalError ( )
604
+ public static func decode( _ source: EncodedScalar ) -> UnicodeScalar {
605
+ let bits = source. _storage
606
+ switch source. _bitCount {
607
+ case 8 :
608
+ return UnicodeScalar ( _unchecked: bits)
609
+ case 16 :
610
+ var value = ( bits & 0b0_______________________11_1111__0000_0000 ) &>> 8
611
+ value |= ( bits & 0b0________________________________0001_1111 ) &<< 6
612
+ return UnicodeScalar ( _unchecked: value)
613
+ case 24 :
614
+ var value = ( bits & 0b0____________11_1111__0000_0000__0000_0000 ) &>> 16
615
+ value |= ( bits & 0b0_______________________11_1111__0000_0000 ) &>> 2
616
+ value |= ( bits & 0b0________________________________0000_1111 ) &<< 12
617
+ return UnicodeScalar ( _unchecked: value)
618
+ default :
619
+ _sanityCheck ( source. count == 4 )
620
+ var value = ( bits & 0b0_11_1111__0000_0000__0000_0000__0000_0000 ) &>> 24
621
+ value |= ( bits & 0b0____________11_1111__0000_0000__0000_0000 ) &>> 10
622
+ value |= ( bits & 0b0_______________________11_1111__0000_0000 ) &<< 4
623
+ value |= ( bits & 0b0________________________________0000_0111 ) &<< 18
624
+ return UnicodeScalar ( _unchecked: value)
625
+ }
607
626
}
608
627
609
628
public struct ForwardDecoder {
@@ -622,10 +641,6 @@ extension Unicode.UTF8 : UnicodeEncoding {
622
641
extension UTF8 . ReverseDecoder : _UTF8Decoder {
623
642
public typealias Encoding = Unicode . UTF8
624
643
625
- public static func decodeOne( _ source: Encoding . EncodedScalar ) -> UnicodeScalar {
626
- return UTF8 . ForwardDecoder. decodeOne ( source)
627
- }
628
-
629
644
public // @testable
630
645
func _parseMultipleCodeUnits( ) -> ( isValid: Bool , bitCount: UInt8 ) {
631
646
_sanityCheck ( buffer. _storage & 0x80 != 0 ) // this case handled elsewhere
@@ -758,30 +773,6 @@ extension
758
773
return 1
759
774
}
760
775
761
- public static func decodeOne( _ source: Encoding . EncodedScalar ) -> UnicodeScalar {
762
- let bits = source. _storage
763
- switch source. _bitCount {
764
- case 8 :
765
- return UnicodeScalar ( _unchecked: bits)
766
- case 16 :
767
- var value = ( bits & 0b0_______________________11_1111__0000_0000 ) &>> 8
768
- value |= ( bits & 0b0________________________________0001_1111 ) &<< 6
769
- return UnicodeScalar ( _unchecked: value)
770
- case 24 :
771
- var value = ( bits & 0b0____________11_1111__0000_0000__0000_0000 ) &>> 16
772
- value |= ( bits & 0b0_______________________11_1111__0000_0000 ) &>> 2
773
- value |= ( bits & 0b0________________________________0000_1111 ) &<< 12
774
- return UnicodeScalar ( _unchecked: value)
775
- default :
776
- _sanityCheck ( source. count == 4 )
777
- var value = ( bits & 0b0_11_1111__0000_0000__0000_0000__0000_0000 ) &>> 24
778
- value |= ( bits & 0b0____________11_1111__0000_0000__0000_0000 ) &>> 10
779
- value |= ( bits & 0b0_______________________11_1111__0000_0000 ) &<< 4
780
- value |= ( bits & 0b0________________________________0000_0111 ) &<< 18
781
- return UnicodeScalar ( _unchecked: value)
782
- }
783
- }
784
-
785
776
public func _bufferedScalar( bitCount: UInt8 ) -> Encoding . EncodedScalar {
786
777
var r = buffer
787
778
r. _bitCount = bitCount
@@ -813,8 +804,14 @@ extension Unicode.UTF16 : UnicodeEncoding {
813
804
return x & 0xf800 != 0xd800
814
805
}
815
806
816
- public static func decode( _ content: EncodedScalar ) -> UnicodeScalar {
817
- fatalError ( )
807
+ public static func decode( _ source: EncodedScalar ) -> UnicodeScalar {
808
+ let bits = source. _storage
809
+ if _fastPath ( source. _bitCount == 16 ) {
810
+ return UnicodeScalar ( _unchecked: bits & 0xffff )
811
+ }
812
+ _sanityCheck ( source. _bitCount == 32 )
813
+ let value = 0x10000 + ( bits >> 16 & 0x03ff | ( bits & 0x03ff ) << 10 )
814
+ return UnicodeScalar ( _unchecked: value)
818
815
}
819
816
820
817
public struct ForwardDecoder {
@@ -843,10 +840,6 @@ extension UTF16.ReverseDecoder : _UTF16Decoder {
843
840
return ( false , 1 * 16 )
844
841
}
845
842
846
- public static func decodeOne( _ source: Encoding . EncodedScalar ) -> UnicodeScalar {
847
- return UTF16 . ForwardDecoder. decodeOne ( source)
848
- }
849
-
850
843
public func _bufferedScalar( bitCount: UInt8 ) -> Encoding . EncodedScalar {
851
844
return Encoding . EncodedScalar (
852
845
_storage:
@@ -869,16 +862,6 @@ extension Unicode.UTF16.ForwardDecoder : _UTF16Decoder {
869
862
return ( false , 1 * 16 )
870
863
}
871
864
872
- public static func decodeOne( _ source: Encoding . EncodedScalar ) -> UnicodeScalar {
873
- let bits = source. _storage
874
- if _fastPath ( source. _bitCount == 16 ) {
875
- return UnicodeScalar ( _unchecked: bits & 0xffff )
876
- }
877
- _sanityCheck ( source. _bitCount == 32 )
878
- let value = 0x10000 + ( bits >> 16 & 0x03ff | ( bits & 0x03ff ) << 10 )
879
- return UnicodeScalar ( _unchecked: value)
880
- }
881
-
882
865
public func _bufferedScalar( bitCount: UInt8 ) -> Encoding . EncodedScalar {
883
866
var r = buffer
884
867
r. _bitCount = bitCount
0 commit comments