@@ -306,32 +306,60 @@ impl DeviceExt for Device {
306
306
return Err ( anyhow ! ( "derive: incorrect syntax for {pname}" ) ) ;
307
307
} ;
308
308
309
- if !pderive. contains ( '.' ) {
310
- self . get_peripheral ( pderive)
311
- . ok_or_else ( || anyhow ! ( "peripheral {pderive} not found" ) ) ?;
312
- }
309
+ let derived_pos = if !pderive. contains ( '.' ) {
310
+ let Some ( ( i, _) ) = self
311
+ . peripherals
312
+ . iter ( )
313
+ . enumerate ( )
314
+ . find ( |( _, f) | f. name == pderive)
315
+ else {
316
+ return Err ( anyhow ! ( "peripheral {pderive} not found" ) ) ;
317
+ } ;
318
+ Some ( i)
319
+ } else {
320
+ None
321
+ } ;
313
322
314
- match self . get_mut_peripheral ( pname) {
315
- Some ( peripheral) => peripheral. modify_from ( info, VAL_LVL ) ?,
323
+ let mut min_pos = self . peripherals . len ( ) ;
324
+ match self
325
+ . peripherals
326
+ . iter_mut ( )
327
+ . enumerate ( )
328
+ . find ( |( _, f) | f. name == pname)
329
+ {
330
+ Some ( ( i, peripheral) ) => {
331
+ min_pos = i;
332
+ peripheral. modify_from ( info, VAL_LVL ) ?;
333
+ }
316
334
None => {
317
335
let peripheral = info. name ( pname. into ( ) ) . build ( VAL_LVL ) ?. single ( ) ;
318
336
self . peripherals . push ( peripheral) ;
319
337
}
320
338
}
321
339
322
- for p in self
323
- . peripherals
324
- . iter_mut ( )
325
- . filter ( |p| p. derived_from . as_deref ( ) == Some ( pname) )
326
- {
327
- p. derived_from = Some ( pderive. into ( ) ) ;
340
+ for ( i, p) in self . peripherals . iter_mut ( ) . enumerate ( ) {
341
+ if p. derived_from . as_deref ( ) == Some ( pname) {
342
+ if i < min_pos {
343
+ min_pos = i;
344
+ }
345
+ p. derived_from = Some ( pderive. into ( ) ) ;
346
+ }
347
+ }
348
+ if let Some ( derived_pos) = derived_pos {
349
+ if derived_pos > min_pos {
350
+ let p = self . peripherals . remove ( derived_pos) ;
351
+ self . peripherals . insert ( min_pos, p) ;
352
+ }
328
353
}
329
354
Ok ( ( ) )
330
355
}
331
356
332
357
fn rebase_peripheral ( & mut self , pnew : & str , pold : & str ) -> PatchResult {
333
- let old = self
334
- . get_mut_peripheral ( pold)
358
+ let ( mut min_pos, old) = self
359
+ . peripherals
360
+ . iter_mut ( )
361
+ . enumerate ( )
362
+ . find ( |( _, f) | f. name == pold)
335
363
. ok_or_else ( || anyhow ! ( "peripheral {pold} not found" ) ) ?;
336
364
let mut d = std:: mem:: replace (
337
365
old,
@@ -347,19 +375,27 @@ impl DeviceExt for Device {
347
375
. build ( VAL_LVL ) ?
348
376
. single ( ) ,
349
377
) ;
350
- let new = self
351
- . get_mut_peripheral ( pnew)
378
+ let ( new_pos, new) = self
379
+ . peripherals
380
+ . iter_mut ( )
381
+ . enumerate ( )
382
+ . find ( |( _, f) | f. name == pnew)
352
383
. ok_or_else ( || anyhow ! ( "peripheral {pnew} not found" ) ) ?;
353
384
d. name = new. name . clone ( ) ;
354
385
d. base_address = new. base_address ;
355
386
d. interrupt = new. interrupt . clone ( ) ;
356
387
* new = d;
357
- for p in self
358
- . peripherals
359
- . iter_mut ( )
360
- . filter ( |p| p. derived_from . as_deref ( ) == Some ( pold) )
361
- {
362
- p. derived_from = Some ( pnew. into ( ) ) ;
388
+ for ( i, p) in self . peripherals . iter_mut ( ) . enumerate ( ) {
389
+ if p. derived_from . as_deref ( ) == Some ( pold) {
390
+ if i < min_pos {
391
+ min_pos = i;
392
+ }
393
+ p. derived_from = Some ( pnew. into ( ) ) ;
394
+ }
395
+ }
396
+ if new_pos > min_pos {
397
+ let p = self . peripherals . remove ( new_pos) ;
398
+ self . peripherals . insert ( min_pos, p) ;
363
399
}
364
400
Ok ( ( ) )
365
401
}
0 commit comments