[stdlib] encode/transcode => [encode/transcode]IfRepresentable...

...to make room for a more useful encode/transcode that inject replacement
characters when encoding fails.
This commit is contained in:
Dave Abrahams
2017-05-07 18:03:55 -07:00
parent 38991ca83f
commit f4610e1638
6 changed files with 28 additions and 21 deletions

View File

@@ -37,7 +37,9 @@ extension _Unicode.UTF16 : UnicodeEncoding {
return UnicodeScalar(_unchecked: value)
}
public static func encode(_ source: UnicodeScalar) -> EncodedScalar? {
public static func encodeIfRepresentable(
_ source: UnicodeScalar
) -> EncodedScalar? {
let x = source.value
if _fastPath(x < (1 << 16)) {
return EncodedScalar(_storage: x, _bitCount: 16)
@@ -50,7 +52,7 @@ extension _Unicode.UTF16 : UnicodeEncoding {
}
@inline(__always)
public static func transcode<FromEncoding : UnicodeEncoding>(
public static func transcodeIfRepresentable<FromEncoding : UnicodeEncoding>(
_ content: FromEncoding.EncodedScalar, from _: FromEncoding.Type
) -> EncodedScalar? {
if _fastPath(FromEncoding.self == UTF8.self) {
@@ -84,12 +86,12 @@ extension _Unicode.UTF16 : UnicodeEncoding {
s &>>= 8
r |= s & 0b0__11_1111
r &= (1 &<< 21) - 1
return encode(UnicodeScalar(_unchecked: r))
return encodeIfRepresentable(UnicodeScalar(_unchecked: r))
}
else if _fastPath(FromEncoding.self == UTF16.self) {
return unsafeBitCast(content, to: UTF16.EncodedScalar.self)
}
return encode(FromEncoding.decode(content))
return encodeIfRepresentable(FromEncoding.decode(content))
}
public struct ForwardParser {

View File

@@ -34,7 +34,9 @@ extension _Unicode.UTF32 : UnicodeEncoding {
}
@inline(__always)
public static func encode(_ source: UnicodeScalar) -> EncodedScalar? {
public static func encodeIfRepresentable(
_ source: UnicodeScalar
) -> EncodedScalar? {
return EncodedScalar(source.value)
}

View File

@@ -58,7 +58,9 @@ extension _Unicode.UTF8 : UnicodeEncoding {
@inline(__always)
@_inlineable
public static func encode(_ source: UnicodeScalar) -> EncodedScalar? {
public static func encodeIfRepresentable(
_ source: UnicodeScalar
) -> EncodedScalar? {
var c = source.value
if _fastPath(c < (1&<<7)) {
return EncodedScalar(_storage: c, _bitCount: 8)
@@ -86,7 +88,7 @@ extension _Unicode.UTF8 : UnicodeEncoding {
}
@inline(__always)
public static func transcode<FromEncoding : UnicodeEncoding>(
public static func transcodeIfRepresentable<FromEncoding : UnicodeEncoding>(
_ content: FromEncoding.EncodedScalar, from _: FromEncoding.Type
) -> EncodedScalar? {
if _fastPath(FromEncoding.self == UTF16.self) {
@@ -116,7 +118,7 @@ extension _Unicode.UTF8 : UnicodeEncoding {
else if _fastPath(FromEncoding.self == UTF8.self) {
return unsafeBitCast(content, to: UTF8.EncodedScalar.self)
}
return encode(FromEncoding.decode(content))
return encodeIfRepresentable(FromEncoding.decode(content))
}
@_fixed_layout

View File

@@ -265,7 +265,7 @@ extension _Unicode.UTF8 : UnicodeCodec {
_ input: UnicodeScalar,
into processCodeUnit: (CodeUnit) -> Void
) {
var s = encode(input)!._storage
var s = encodeIfRepresentable(input)!._storage
processCodeUnit(UInt8(extendingOrTruncating: s))
s &>>= 8
if _fastPath(s == 0) { return }
@@ -414,7 +414,7 @@ extension _Unicode.UTF16 : UnicodeCodec {
_ input: UnicodeScalar,
into processCodeUnit: (CodeUnit) -> Void
) {
var s = encode(input)!._storage
var s = encodeIfRepresentable(input)!._storage
processCodeUnit(UInt16(extendingOrTruncating: s))
s &>>= 16
if _fastPath(s == 0) { return }

View File

@@ -26,11 +26,11 @@ public protocol _UnicodeEncoding {
/// Converts from encoding-independent to encoded representation, returning
/// `nil` if the scalar can't be represented in this encoding.
static func encode(_ content: UnicodeScalar) -> EncodedScalar?
static func encodeIfRepresentable(_ content: UnicodeScalar) -> EncodedScalar?
/// Converts a scalar from another encoding's representation, returning
/// `nil` if the scalar can't be represented in this encoding.
static func transcode<FromEncoding : UnicodeEncoding>(
static func transcodeIfRepresentable<FromEncoding : UnicodeEncoding>(
_ content: FromEncoding.EncodedScalar, from _: FromEncoding.Type
) -> EncodedScalar?
@@ -55,7 +55,7 @@ public protocol UnicodeEncoding : _UnicodeEncoding
where ForwardParser.Encoding == Self, ReverseParser.Encoding == Self {}
extension _UnicodeEncoding {
public static func transcode<FromEncoding : UnicodeEncoding>(
public static func transcodeIfRepresentable<FromEncoding : UnicodeEncoding>(
_ content: FromEncoding.EncodedScalar, from _: FromEncoding.Type
) -> EncodedScalar? {
return encode(FromEncoding.decode(content))

View File

@@ -221,12 +221,12 @@ func checkDecodeUTF<Codec : UnicodeCodec & UnicodeEncoding>(
decoded.append(scalar)
expectEqual(
UnicodeScalar(scalar),
Codec.decode(Codec.encode(UnicodeScalar(scalar)!)!))
Codec.decode(Codec.encodeIfRepresentable(UnicodeScalar(scalar)!)!))
}
func output1(_ scalar: UnicodeScalar) {
decoded.append(scalar.value)
expectEqual(scalar, Codec.decode(Codec.encode(scalar)!))
expectEqual(scalar, Codec.decode(Codec.encodeIfRepresentable(scalar)!))
}
var result = assertionSuccess()
@@ -307,16 +307,17 @@ func checkDecodeUTF<Codec : UnicodeCodec & UnicodeEncoding>(
//===--- Transcoded Scalars ---------------------------------------------===//
for x in decoded.lazy.map({ UnicodeScalar($0)! }) {
expectEqualSequence(
UTF8.encode(x)!,
UTF8.transcode(Codec.encode(x)!, from: Codec.self)!
UTF8.encodeIfRepresentable(x)!,
UTF8.transcode(Codec.encodeIfRepresentable(x)!, from: Codec.self)!
)
expectEqualSequence(
UTF16.encode(x)!,
UTF16.transcode(Codec.encode(x)!, from: Codec.self)!
UTF16.encodeIfRepresentable(x)!,
UTF16.transcodeIfRepresentable(
Codec.encodeIfRepresentable(x)!, from: Codec.self)!
)
expectEqualSequence(
UTF32.encode(x)!,
UTF32.transcode(Codec.encode(x)!, from: Codec.self)!
UTF32.encodeIfRepresentable(x)!,
UTF32.transcodeIfRepresentable(Codec.encode(x)!, from: Codec.self)!
)
}