File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments