Skip to content

Commit 123f0b2

Browse files
committed
asset.rs: Use Rc::get_mut to avoid unnecessary clone
1 parent 0b0ac72 commit 123f0b2

1 file changed

Lines changed: 22 additions & 6 deletions

File tree

src/asset.rs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -286,16 +286,32 @@ impl AssetPool {
286286
where
287287
I: IntoIterator<Item = Rc<Asset>>,
288288
{
289-
let new_pool = assets.into_iter().map(|asset| {
289+
let new_pool = assets.into_iter().map(|mut asset| {
290290
if asset.id.is_some() {
291291
// Already commissioned
292292
asset.into()
293293
} else {
294-
// Newly created from process. We need to assign an ID.
295-
let mut asset = asset.as_ref().clone();
296-
asset.id = Some(AssetID(self.next_id));
297-
self.next_id += 1;
298-
asset.into()
294+
let mut update_id = |asset: &mut Asset| {
295+
// We need to assign an ID
296+
asset.id = Some(AssetID(self.next_id));
297+
self.next_id += 1;
298+
};
299+
300+
// Asset is newly created from process. We use `get_mut` to avoid a clone in the
301+
// (likely) case that there is only one reference to `asset`
302+
let rc_asset = match Rc::get_mut(&mut asset) {
303+
Some(asset_inner) => {
304+
update_id(asset_inner);
305+
asset
306+
}
307+
None => {
308+
let mut asset = asset.as_ref().clone();
309+
update_id(&mut asset);
310+
asset.into()
311+
}
312+
};
313+
314+
rc_asset.into()
299315
}
300316
});
301317

0 commit comments

Comments
 (0)