Skip to content

Commit 7cbe747

Browse files
committed
sort derived peripherals
1 parent 31cfcae commit 7cbe747

File tree

1 file changed

+58
-22
lines changed

1 file changed

+58
-22
lines changed

src/patch/device.rs

+58-22
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)