@@ -72,18 +72,9 @@ extension _SmallString {
72
72
}
73
73
}
74
74
75
- @inlinable
76
- internal var discriminator : _StringObject . Discriminator {
77
- @inline ( __always) get {
78
- let value = _storage. 1 &>> _StringObject. Nibbles. discriminatorShift
79
- return _StringObject. Discriminator ( UInt8 ( truncatingIfNeeded: value) )
80
- }
81
- @inline ( __always) set {
82
- _storage. 1 &= _StringObject. Nibbles. largeAddressMask
83
- _storage. 1 |= (
84
- UInt64 ( truncatingIfNeeded: newValue. _value)
85
- &<< _StringObject. Nibbles. discriminatorShift)
86
- }
75
+ @inlinable @inline ( __always)
76
+ internal var rawDiscriminatedObject : UInt64 {
77
+ return _storage. 1
87
78
}
88
79
89
80
@inlinable
@@ -96,7 +87,7 @@ extension _SmallString {
96
87
@inlinable
97
88
internal var count : Int {
98
89
@inline ( __always) get {
99
- return discriminator . smallCount
90
+ return _StringObject . getSmallCount ( fromRaw : rawDiscriminatedObject )
100
91
}
101
92
}
102
93
@@ -108,27 +99,22 @@ extension _SmallString {
108
99
@inlinable
109
100
internal var isASCII : Bool {
110
101
@inline ( __always) get {
111
- return discriminator . smallIsASCII
102
+ return _StringObject . getSmallIsASCII ( fromRaw : rawDiscriminatedObject )
112
103
}
113
104
}
114
105
115
106
// Give raw, nul-terminated code units. This is only for limited internal
116
107
// usage: it always clears the discriminator and count (in case it's full)
117
- @inlinable
108
+ @inlinable @ inline ( __always )
118
109
internal var zeroTerminatedRawCodeUnits : RawBitPattern {
119
- @inline ( __always) get {
120
- return (
121
- self . _storage. 0 ,
122
- self . _storage. 1 & _StringObject. Nibbles. largeAddressMask)
123
- }
110
+ let smallStringCodeUnitMask : UInt64 = 0x00FF_FFFF_FFFF_FFFF
111
+ return ( self . _storage. 0 , self . _storage. 1 & smallStringCodeUnitMask)
124
112
}
125
113
126
- @inlinable
127
114
internal func computeIsASCII( ) -> Bool {
128
- // TODO(String micro-performance): Evaluate other expressions, e.g. | first
129
115
let asciiMask : UInt64 = 0x8080_8080_8080_8080
130
116
let raw = zeroTerminatedRawCodeUnits
131
- return ( raw. 0 & asciiMask == 0 ) && ( raw. 1 & asciiMask == 0 )
117
+ return ( raw. 0 | raw. 1 ) & asciiMask == 0
132
118
}
133
119
}
134
120
@@ -220,7 +206,7 @@ extension _SmallString {
220
206
221
207
// Overwrite stored code units, including uninitialized. `f` should return the
222
208
// new count.
223
- @inlinable @ inline ( __always)
209
+ @inline ( __always)
224
210
internal mutating func withMutableCapacity(
225
211
_ f: ( UnsafeMutableBufferPointer < UInt8 > ) throws -> Int
226
212
) rethrows {
@@ -231,14 +217,28 @@ extension _SmallString {
231
217
return try f ( UnsafeMutableBufferPointer (
232
218
start: ptr, count: _SmallString. capacity) )
233
219
}
234
-
235
220
_internalInvariant ( len <= _SmallString. capacity)
236
- discriminator = . small( withCount: len, isASCII: self . computeIsASCII ( ) )
221
+
222
+ let ( leading, trailing) = self . zeroTerminatedRawCodeUnits
223
+ self = _SmallString ( leading: leading, trailing: trailing, count: len)
237
224
}
238
225
}
239
226
240
227
// Creation
241
228
extension _SmallString {
229
+ @inlinable @inline ( __always)
230
+ internal init ( leading: UInt64 , trailing: UInt64 , count: Int ) {
231
+ _internalInvariant ( count <= _SmallString. capacity)
232
+
233
+ let isASCII = ( leading | trailing) & 0x8080_8080_8080_8080 == 0
234
+ let countAndDiscriminator = UInt64 ( truncatingIfNeeded: count) &<< 56
235
+ | _StringObject. Nibbles. small ( isASCII: isASCII)
236
+ _internalInvariant ( trailing & countAndDiscriminator == 0 )
237
+
238
+ self . init ( raw: ( leading, trailing | countAndDiscriminator) )
239
+ _internalInvariant ( self . count == count)
240
+ }
241
+
242
242
// Direct from UTF-8
243
243
@inlinable @inline ( __always)
244
244
internal init ? ( _ input: UnsafeBufferPointer < UInt8 > ) {
@@ -251,11 +251,7 @@ extension _SmallString {
251
251
let leading = _bytesToUInt64 ( ptr, Swift . min ( input. count, 8 ) )
252
252
let trailing = count > 8 ? _bytesToUInt64 ( ptr + 8 , count &- 8 ) : 0
253
253
254
- let isASCII = ( leading | trailing) & 0x8080_8080_8080_8080 == 0
255
- let discriminator = _StringObject. Discriminator. small (
256
- withCount: count,
257
- isASCII: isASCII)
258
- self . init ( raw: ( leading, trailing | discriminator. rawBits) )
254
+ self . init ( leading: leading, trailing: trailing, count: count)
259
255
}
260
256
261
257
@usableFromInline // @testable
@@ -273,13 +269,8 @@ extension _SmallString {
273
269
}
274
270
_internalInvariant ( writeIdx == totalCount)
275
271
276
- let isASCII = base. isASCII && other. isASCII
277
- let discriminator = _StringObject. Discriminator. small (
278
- withCount: totalCount,
279
- isASCII: isASCII)
280
-
281
272
let ( leading, trailing) = result. zeroTerminatedRawCodeUnits
282
- self . init ( raw : ( leading, trailing | discriminator . rawBits ) )
273
+ self . init ( leading : leading, trailing: trailing , count : totalCount )
283
274
}
284
275
}
285
276
0 commit comments