@@ -306,32 +306,60 @@ impl DeviceExt for Device {
306306 return Err ( anyhow ! ( "derive: incorrect syntax for {pname}" ) ) ;
307307 } ;
308308
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+ } ;
313322
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+ }
316334 None => {
317335 let peripheral = info. name ( pname. into ( ) ) . build ( VAL_LVL ) ?. single ( ) ;
318336 self . peripherals . push ( peripheral) ;
319337 }
320338 }
321339
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+ }
328353 }
329354 Ok ( ( ) )
330355 }
331356
332357 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)
335363 . ok_or_else ( || anyhow ! ( "peripheral {pold} not found" ) ) ?;
336364 let mut d = std:: mem:: replace (
337365 old,
@@ -347,19 +375,27 @@ impl DeviceExt for Device {
347375 . build ( VAL_LVL ) ?
348376 . single ( ) ,
349377 ) ;
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)
352383 . ok_or_else ( || anyhow ! ( "peripheral {pnew} not found" ) ) ?;
353384 d. name = new. name . clone ( ) ;
354385 d. base_address = new. base_address ;
355386 d. interrupt = new. interrupt . clone ( ) ;
356387 * 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) ;
363399 }
364400 Ok ( ( ) )
365401 }
0 commit comments