@@ -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,7 +99,7 @@ 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
@@ -123,12 +114,10 @@ extension _SmallString {
123
114
}
124
115
}
125
116
126
- @inlinable
127
117
internal func computeIsASCII( ) -> Bool {
128
- // TODO(String micro-performance): Evaluate other expressions, e.g. | first
129
118
let asciiMask : UInt64 = 0x8080_8080_8080_8080
130
119
let raw = zeroTerminatedRawCodeUnits
131
- return ( raw. 0 & asciiMask == 0 ) && ( raw. 1 & asciiMask == 0 )
120
+ return ( raw. 0 | raw. 1 ) & asciiMask == 0
132
121
}
133
122
}
134
123
@@ -220,7 +209,7 @@ extension _SmallString {
220
209
221
210
// Overwrite stored code units, including uninitialized. `f` should return the
222
211
// new count.
223
- @inlinable @ inline ( __always)
212
+ @inline ( __always)
224
213
internal mutating func withMutableCapacity(
225
214
_ f: ( UnsafeMutableBufferPointer < UInt8 > ) throws -> Int
226
215
) rethrows {
@@ -231,14 +220,27 @@ extension _SmallString {
231
220
return try f ( UnsafeMutableBufferPointer (
232
221
start: ptr, count: _SmallString. capacity) )
233
222
}
234
-
235
223
_internalInvariant ( len <= _SmallString. capacity)
236
- discriminator = . small( withCount: len, isASCII: self . computeIsASCII ( ) )
224
+
225
+ let ( leading, trailing) = self . zeroTerminatedRawCodeUnits
226
+ self = _SmallString ( leading: leading, trailing: trailing, count: len)
237
227
}
238
228
}
239
229
240
230
// Creation
241
231
extension _SmallString {
232
+ @inlinable @inline ( __always)
233
+ internal init ( leading: UInt64 , trailing: UInt64 , count: Int ) {
234
+ _internalInvariant ( count <= _SmallString. capacity)
235
+
236
+ let isASCII = ( leading | trailing) & 0x8080_8080_8080_8080 == 0
237
+ let countAndDiscriminator = UInt64 ( truncatingIfNeeded: count) &<< 56
238
+ | _StringObject. Nibbles. small ( isASCII: isASCII)
239
+ _internalInvariant ( trailing & countAndDiscriminator == 0 )
240
+
241
+ self . init ( raw: ( leading, trailing | countAndDiscriminator) )
242
+ }
243
+
242
244
// Direct from UTF-8
243
245
@inlinable @inline ( __always)
244
246
internal init ? ( _ input: UnsafeBufferPointer < UInt8 > ) {
@@ -251,11 +253,7 @@ extension _SmallString {
251
253
let leading = _bytesToUInt64 ( ptr, Swift . min ( input. count, 8 ) )
252
254
let trailing = count > 8 ? _bytesToUInt64 ( ptr + 8 , count &- 8 ) : 0
253
255
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) )
256
+ self . init ( leading: leading, trailing: trailing, count: count)
259
257
}
260
258
261
259
@usableFromInline // @testable
@@ -273,13 +271,8 @@ extension _SmallString {
273
271
}
274
272
_internalInvariant ( writeIdx == totalCount)
275
273
276
- let isASCII = base. isASCII && other. isASCII
277
- let discriminator = _StringObject. Discriminator. small (
278
- withCount: totalCount,
279
- isASCII: isASCII)
280
-
281
274
let ( leading, trailing) = result. zeroTerminatedRawCodeUnits
282
- self . init ( raw : ( leading, trailing | discriminator . rawBits ) )
275
+ self . init ( leading : leading, trailing: trailing , count : totalCount )
283
276
}
284
277
}
285
278
0 commit comments