Skip to content

Commit 5b31417

Browse files
author
Dave Abrahams
committed
[stdlib] UnicodeDecoders: Hoist decode() up to UnicodeEncoding
1 parent 14ac493 commit 5b31417

File tree

1 file changed

+45
-62
lines changed

1 file changed

+45
-62
lines changed

test/Prototypes/UnicodeDecoders.swift

Lines changed: 45 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -281,10 +281,20 @@ public protocol UnicodeDecoder {
281281
mutating func parseOne<I : IteratorProtocol>(
282282
_ input: inout I
283283
) -> Unicode.ParseResult<Encoding.EncodedScalar> where I.Element == Encoding.CodeUnit
284+
}
285+
286+
public protocol _UnicodeEncoding : _UnicodeEncodingBase {
284287

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
286293
}
287294

295+
protocol UnicodeEncoding : _UnicodeEncoding
296+
where ForwardDecoder.Encoding == Self, ReverseDecoder.Encoding == Self {}
297+
288298
extension UnicodeDecoder {
289299
@inline(__always)
290300
@discardableResult
@@ -300,7 +310,7 @@ extension UnicodeDecoder {
300310
while true {
301311
switch d.parseOne(&input) {
302312
case let .valid(scalarContent):
303-
output(decodeOne(scalarContent))
313+
output(Encoding.decode(scalarContent))
304314
case .invalid:
305315
if !makeRepairs { return 1 }
306316
errors += 1
@@ -364,9 +374,7 @@ extension Unicode.DefaultScalarView : Sequence {
364374

365375
extension Unicode.DefaultScalarView.Iterator : IteratorProtocol, Sequence {
366376
mutating func next() -> UnicodeScalar? {
367-
return parsing.next().map {
368-
Encoding.ForwardDecoder.decodeOne($0)
369-
}
377+
return parsing.next().map { Encoding.decode($0) }
370378
}
371379
}
372380

@@ -435,7 +443,7 @@ extension Unicode.DefaultScalarView : Collection {
435443
case .valid(let scalarContent):
436444
return Index(
437445
codeUnitIndex: nextPosition,
438-
scalar: Encoding.ForwardDecoder.decodeOne(scalarContent),
446+
scalar: Encoding.decode(scalarContent),
439447
stride: numericCast(scalarContent.count))
440448
case .invalid(let stride):
441449
return Index(
@@ -492,7 +500,7 @@ extension Unicode.DefaultScalarView : BidirectionalCollection {
492500
let d: CodeUnits.IndexDistance = -numericCast(scalarContent.count)
493501
return Index(
494502
codeUnitIndex: codeUnits.index(i.codeUnitIndex, offsetBy: d),
495-
scalar: Encoding.ReverseDecoder.decodeOne(scalarContent),
503+
scalar: Encoding.decode(scalarContent),
496504
stride: numericCast(scalarContent.count))
497505
case .invalid(let stride):
498506
let d: CodeUnits.IndexDistance = -numericCast(stride)
@@ -505,15 +513,6 @@ extension Unicode.DefaultScalarView : BidirectionalCollection {
505513
}
506514
}
507515

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-
517516
public protocol _UTFDecoder : UnicodeDecoder
518517
where Encoding.EncodedScalar == _UIntBuffer<_UInt32, Encoding.CodeUnit>,
519518
_UInt32 == UInt32
@@ -602,8 +601,28 @@ extension Unicode.UTF8 : UnicodeEncoding {
602601

603602
public static func _isScalar(_ x: CodeUnit) -> Bool { return x & 0x80 == 0 }
604603

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+
}
607626
}
608627

609628
public struct ForwardDecoder {
@@ -622,10 +641,6 @@ extension Unicode.UTF8 : UnicodeEncoding {
622641
extension UTF8.ReverseDecoder : _UTF8Decoder {
623642
public typealias Encoding = Unicode.UTF8
624643

625-
public static func decodeOne(_ source: Encoding.EncodedScalar) -> UnicodeScalar {
626-
return UTF8.ForwardDecoder.decodeOne(source)
627-
}
628-
629644
public // @testable
630645
func _parseMultipleCodeUnits() -> (isValid: Bool, bitCount: UInt8) {
631646
_sanityCheck(buffer._storage & 0x80 != 0) // this case handled elsewhere
@@ -758,30 +773,6 @@ extension
758773
return 1
759774
}
760775

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-
785776
public func _bufferedScalar(bitCount: UInt8) -> Encoding.EncodedScalar {
786777
var r = buffer
787778
r._bitCount = bitCount
@@ -813,8 +804,14 @@ extension Unicode.UTF16 : UnicodeEncoding {
813804
return x & 0xf800 != 0xd800
814805
}
815806

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)
818815
}
819816

820817
public struct ForwardDecoder {
@@ -843,10 +840,6 @@ extension UTF16.ReverseDecoder : _UTF16Decoder {
843840
return (false, 1*16)
844841
}
845842

846-
public static func decodeOne(_ source: Encoding.EncodedScalar) -> UnicodeScalar {
847-
return UTF16.ForwardDecoder.decodeOne(source)
848-
}
849-
850843
public func _bufferedScalar(bitCount: UInt8) -> Encoding.EncodedScalar {
851844
return Encoding.EncodedScalar(
852845
_storage:
@@ -869,16 +862,6 @@ extension Unicode.UTF16.ForwardDecoder : _UTF16Decoder {
869862
return (false, 1*16)
870863
}
871864

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-
882865
public func _bufferedScalar(bitCount: UInt8) -> Encoding.EncodedScalar {
883866
var r = buffer
884867
r._bitCount = bitCount

0 commit comments

Comments
 (0)