@@ -187,45 +187,49 @@ extension _NativeDictionary { // Low-level lookup operations
187
187
}
188
188
189
189
extension _NativeDictionary { // ensureUnique
190
- @inlinable
191
- internal mutating func resize( capacity: Int ) {
190
+ @_alwaysEmitIntoClient
191
+ @inline ( never)
192
+ internal mutating func _copyOrMoveAndResize(
193
+ capacity: Int ,
194
+ moveElements: Bool
195
+ ) {
192
196
let capacity = Swift . max ( capacity, self . capacity)
193
197
let newStorage = _DictionaryStorage < Key , Value > . resize (
194
198
original: _storage,
195
199
capacity: capacity,
196
- move: true )
200
+ move: moveElements )
197
201
let result = _NativeDictionary ( newStorage)
198
202
if count > 0 {
199
203
for bucket in hashTable {
200
- let key = ( _keys + bucket. offset) . move ( )
201
- let value = ( _values + bucket. offset) . move ( )
204
+ let key : Key
205
+ let value : Value
206
+ if moveElements {
207
+ key = ( _keys + bucket. offset) . move ( )
208
+ value = ( _values + bucket. offset) . move ( )
209
+ } else {
210
+ key = self . uncheckedKey ( at: bucket)
211
+ value = self . uncheckedValue ( at: bucket)
212
+ }
202
213
result. _unsafeInsertNew ( key: key, value: value)
203
214
}
204
- // Clear out old storage, ensuring that its deinit won't overrelease the
205
- // elements we've just moved out.
206
- _storage. _hashTable. clear ( )
207
- _storage. _count = 0
215
+ if moveElements {
216
+ // Clear out old storage, ensuring that its deinit won't overrelease the
217
+ // elements we've just moved out.
218
+ _storage. _hashTable. clear ( )
219
+ _storage. _count = 0
220
+ }
208
221
}
209
222
_storage = result. _storage
210
223
}
211
224
212
225
@inlinable
213
- @_semantics ( " optimize.sil.specialize.generic.size.never " )
226
+ internal mutating func resize( capacity: Int ) {
227
+ _copyOrMoveAndResize ( capacity: capacity, moveElements: true )
228
+ }
229
+
230
+ @inlinable
214
231
internal mutating func copyAndResize( capacity: Int ) {
215
- let capacity = Swift . max ( capacity, self . capacity)
216
- let newStorage = _DictionaryStorage < Key , Value > . resize (
217
- original: _storage,
218
- capacity: capacity,
219
- move: false )
220
- let result = _NativeDictionary ( newStorage)
221
- if count > 0 {
222
- for bucket in hashTable {
223
- result. _unsafeInsertNew (
224
- key: self . uncheckedKey ( at: bucket) ,
225
- value: self . uncheckedValue ( at: bucket) )
226
- }
227
- }
228
- _storage = result. _storage
232
+ _copyOrMoveAndResize ( capacity: capacity, moveElements: false )
229
233
}
230
234
231
235
@inlinable
0 commit comments