10
10
//
11
11
//===----------------------------------------------------------------------===//
12
12
extension _Unicode {
13
+ @_fixed_layout
13
14
public enum UTF8 {
14
15
case _swift3Buffer( _Unicode . UTF8 . ForwardParser )
15
16
}
@@ -23,10 +24,14 @@ extension _Unicode.UTF8 : UnicodeEncoding {
23
24
return EncodedScalar ( _storage: 0xbdbfef , _bitCount: 24 )
24
25
}
25
26
27
+ @inline ( __always)
28
+ @_inlineable
26
29
public static func _isScalar( _ x: CodeUnit ) -> Bool {
27
30
return x & 0x80 == 0
28
31
}
29
32
33
+ @inline ( __always)
34
+ @_inlineable
30
35
public static func decode( _ source: EncodedScalar ) -> UnicodeScalar {
31
36
let bits = source. _storage
32
37
switch source. _bitCount {
@@ -51,6 +56,8 @@ extension _Unicode.UTF8 : UnicodeEncoding {
51
56
}
52
57
}
53
58
59
+ @inline ( __always)
60
+ @_inlineable
54
61
public static func encode( _ source: UnicodeScalar ) -> EncodedScalar {
55
62
var c = source. value
56
63
if _fastPath ( c < ( 1 &< < 7 ) ) {
@@ -80,20 +87,25 @@ extension _Unicode.UTF8 : UnicodeEncoding {
80
87
81
88
public struct ForwardParser {
82
89
public typealias _Buffer = _UIntBuffer < UInt32 , UInt8 >
90
+ @inline ( __always)
91
+ @_inlineable
83
92
public init( ) { _buffer = _Buffer ( ) }
84
93
public var _buffer : _Buffer
85
94
}
86
95
87
96
public struct ReverseParser {
88
97
public typealias _Buffer = _UIntBuffer < UInt32 , UInt8 >
98
+ @inline ( __always)
99
+ @_inlineable
89
100
public init( ) { _buffer = _Buffer ( ) }
90
101
public var _buffer : _Buffer
91
102
}
92
103
}
93
104
94
105
extension UTF8 . ReverseParser : UnicodeParser, _UTFParser {
95
106
public typealias Encoding = _Unicode. UTF8
96
-
107
+ @inline ( __always)
108
+ @_inlineable
97
109
public func _parseMultipleCodeUnits( ) -> ( isValid: Bool , bitCount: UInt8 ) {
98
110
_sanityCheck ( _buffer. _storage & 0x80 != 0 ) // this case handled elsewhere
99
111
if _buffer. _storage & 0b0__1110_0000__1100_0000
@@ -128,6 +140,7 @@ extension UTF8.ReverseParser : UnicodeParser, _UTFParser {
128
140
/// Returns the length of the invalid sequence that ends with the LSB of
129
141
/// buffer.
130
142
@inline ( never)
143
+ @_versioned
131
144
func _invalidLength( ) -> UInt8 {
132
145
if _buffer. _storage & 0b0__1111_0000__1100_0000
133
146
== 0b0__1110_0000__1000_0000 {
@@ -156,6 +169,8 @@ extension UTF8.ReverseParser : UnicodeParser, _UTFParser {
156
169
return 1
157
170
}
158
171
172
+ @inline ( __always)
173
+ @_inlineable
159
174
public func _bufferedScalar( bitCount: UInt8 ) -> Encoding . EncodedScalar {
160
175
return Encoding . EncodedScalar (
161
176
_storage: _buffer. _storage. byteSwapped &>> ( 32 - bitCount) ,
@@ -166,7 +181,9 @@ extension UTF8.ReverseParser : UnicodeParser, _UTFParser {
166
181
167
182
extension _Unicode. UTF8. ForwardParser : UnicodeParser, _UTFParser {
168
183
public typealias Encoding = _Unicode. UTF8
169
-
184
+
185
+ @inline ( __always)
186
+ @_inlineable
170
187
public func _parseMultipleCodeUnits( ) -> ( isValid: Bool , bitCount: UInt8 ) {
171
188
_sanityCheck ( _buffer. _storage & 0x80 != 0 ) // this case handled elsewhere
172
189
@@ -201,6 +218,7 @@ extension _Unicode.UTF8.ForwardParser : UnicodeParser, _UTFParser {
201
218
/// Returns the length of the invalid sequence that starts with the LSB of
202
219
/// buffer.
203
220
@inline ( never)
221
+ @_versioned
204
222
func _invalidLength( ) -> UInt8 {
205
223
if _buffer. _storage & 0b0__1100_0000__1111_0000
206
224
== 0b0__1000_0000__1110_0000 {
0 commit comments