mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[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:
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)!
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user