Skip to content

Commit 11d5374

Browse files
committed
remove OptIter get_enumeratedValues
1 parent 460cdbf commit 11d5374

File tree

5 files changed

+77
-80
lines changed

5 files changed

+77
-80
lines changed

svd-rs/src/clusterinfo.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -237,11 +237,9 @@ impl ClusterInfo {
237237

238238
/// Returns iterator over all descendant registers
239239
pub fn all_registers(&self) -> AllRegistersIter {
240-
let mut rem: Vec<&RegisterCluster> = Vec::with_capacity(self.children.len());
241-
for r in self.children.iter().rev() {
242-
rem.push(r);
240+
AllRegistersIter {
241+
rem: self.children.iter().rev().collect(),
243242
}
244-
AllRegistersIter { rem }
245243
}
246244

247245
/// Returns mutable iterator over all descendant registers
@@ -252,11 +250,9 @@ impl ClusterInfo {
252250

253251
/// Returns mutable iterator over all descendant registers
254252
pub fn all_registers_mut(&mut self) -> AllRegistersIterMut {
255-
let mut rem: Vec<&mut RegisterCluster> = Vec::with_capacity(self.children.len());
256-
for r in self.children.iter_mut().rev() {
257-
rem.push(r);
253+
AllRegistersIterMut {
254+
rem: self.children.iter_mut().rev().collect(),
258255
}
259-
AllRegistersIterMut { rem }
260256
}
261257

262258
/// Returns iterator over child registers

svd-rs/src/fieldinfo.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -295,12 +295,30 @@ impl FieldInfo {
295295
if lvl.is_strict() {
296296
match self.enumerated_values.as_slice() {
297297
[] | [_] => {}
298-
[ev1, ev2]
299-
if (ev1.usage() == Usage::Read && ev2.usage() == Usage::Write)
300-
|| (ev2.usage() == Usage::Read && ev1.usage() == Usage::Write) => {}
298+
[ev1, ev2] if (ev1.usage() == Usage::Read && ev2.usage() == Usage::Write) => {}
299+
[ev1, ev2] if (ev2.usage() == Usage::Read && ev1.usage() == Usage::Write) => {}
301300
_ => return Err(Error::IncompatibleEnumeratedValues.into()),
302301
}
303302
}
304303
Ok(())
305304
}
305+
306+
/// Get enumeratedValues cluster by usage
307+
pub fn get_enumerated_values(&self, usage: Usage) -> Option<&EnumeratedValues> {
308+
match self.enumerated_values.len() {
309+
1 | 2 => self.enumerated_values.iter().find(|ev| ev.usage() == usage),
310+
_ => None,
311+
}
312+
}
313+
314+
/// Get mutable enumeratedValues by usage
315+
pub fn get_mut_enumerated_values(&mut self, usage: Usage) -> Option<&mut EnumeratedValues> {
316+
match self.enumerated_values.len() {
317+
1 | 2 => self
318+
.enumerated_values
319+
.iter_mut()
320+
.find(|ev| ev.usage() == usage),
321+
_ => None,
322+
}
323+
}
306324
}

svd-rs/src/lib.rs

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -256,28 +256,3 @@ struct DeserArray<T> {
256256
#[serde(flatten)]
257257
info: T,
258258
}
259-
260-
/// Iterates over optional iterator
261-
pub struct OptIter<I>(Option<I>)
262-
where
263-
I: Iterator;
264-
265-
impl<I> OptIter<I>
266-
where
267-
I: Iterator,
268-
{
269-
/// Create new optional iterator
270-
pub fn new(o: Option<I>) -> Self {
271-
Self(o)
272-
}
273-
}
274-
275-
impl<'a, I> Iterator for OptIter<I>
276-
where
277-
I: Iterator,
278-
{
279-
type Item = I::Item;
280-
fn next(&mut self) -> Option<Self::Item> {
281-
self.0.as_mut().and_then(I::next)
282-
}
283-
}

svd-rs/src/peripheralinfo.rs

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use super::{
33
AllRegistersIter, AllRegistersIterMut, ClusterIter, ClusterIterMut, RegisterIter,
44
RegisterIterMut,
55
},
6-
AddressBlock, BuildError, Cluster, DimElement, EmptyToNone, Interrupt, OptIter, Peripheral,
7-
Register, RegisterCluster, RegisterProperties, SvdError, ValidateLevel,
6+
AddressBlock, BuildError, Cluster, DimElement, EmptyToNone, Interrupt, Peripheral, Register,
7+
RegisterCluster, RegisterProperties, SvdError, ValidateLevel,
88
};
99

1010
/// Errors from [Peripheral::validate]
@@ -361,35 +361,43 @@ impl PeripheralInfo {
361361
}
362362

363363
/// Returns iterator over child registers
364-
pub fn registers(&self) -> OptIter<RegisterIter> {
365-
OptIter::new(
366-
self.registers
367-
.as_ref()
368-
.map(|regs| RegisterIter { all: regs.iter() }),
369-
)
364+
pub fn registers(&self) -> RegisterIter {
365+
RegisterIter {
366+
all: match &self.registers {
367+
Some(regs) => regs.iter(),
368+
None => [].iter(),
369+
},
370+
}
370371
}
371372

372373
/// Returns mutable iterator over child registers
373-
pub fn registers_mut(&mut self) -> OptIter<RegisterIterMut> {
374-
OptIter::new(self.registers.as_mut().map(|regs| RegisterIterMut {
375-
all: regs.iter_mut(),
376-
}))
374+
pub fn registers_mut(&mut self) -> RegisterIterMut {
375+
RegisterIterMut {
376+
all: match &mut self.registers {
377+
Some(regs) => regs.iter_mut(),
378+
None => [].iter_mut(),
379+
},
380+
}
377381
}
378382

379383
/// Returns iterator over child clusters
380-
pub fn clusters(&self) -> OptIter<ClusterIter> {
381-
OptIter::new(
382-
self.registers
383-
.as_ref()
384-
.map(|regs| ClusterIter { all: regs.iter() }),
385-
)
384+
pub fn clusters(&self) -> ClusterIter {
385+
ClusterIter {
386+
all: match &self.registers {
387+
Some(regs) => regs.iter(),
388+
None => [].iter(),
389+
},
390+
}
386391
}
387392

388393
/// Returns mutable iterator over child clusters
389-
pub fn clusters_mut(&mut self) -> OptIter<ClusterIterMut> {
390-
OptIter::new(self.registers.as_mut().map(|regs| ClusterIterMut {
391-
all: regs.iter_mut(),
392-
}))
394+
pub fn clusters_mut(&mut self) -> ClusterIterMut {
395+
ClusterIterMut {
396+
all: match &mut self.registers {
397+
Some(regs) => regs.iter_mut(),
398+
None => [].iter_mut(),
399+
},
400+
}
393401
}
394402

395403
/// Returns iterator over all descendant registers
@@ -400,14 +408,11 @@ impl PeripheralInfo {
400408

401409
/// Returns iterator over all descendant registers
402410
pub fn all_registers(&self) -> AllRegistersIter {
403-
if let Some(regs) = &self.registers {
404-
let mut rem: Vec<&RegisterCluster> = Vec::with_capacity(regs.len());
405-
for r in regs.iter().rev() {
406-
rem.push(r);
407-
}
408-
AllRegistersIter { rem }
409-
} else {
410-
AllRegistersIter { rem: Vec::new() }
411+
AllRegistersIter {
412+
rem: match &self.registers {
413+
Some(regs) => regs.iter().rev().collect(),
414+
None => Vec::new(),
415+
},
411416
}
412417
}
413418

@@ -419,14 +424,11 @@ impl PeripheralInfo {
419424

420425
/// Returns mutable iterator over all descendant registers
421426
pub fn all_registers_mut(&mut self) -> AllRegistersIterMut {
422-
if let Some(regs) = &mut self.registers {
423-
let mut rem: Vec<&mut RegisterCluster> = Vec::with_capacity(regs.len());
424-
for r in regs.iter_mut().rev() {
425-
rem.push(r);
426-
}
427-
AllRegistersIterMut { rem }
428-
} else {
429-
AllRegistersIterMut { rem: Vec::new() }
427+
AllRegistersIterMut {
428+
rem: match &mut self.registers {
429+
Some(regs) => regs.iter_mut().rev().collect(),
430+
None => Vec::new(),
431+
},
430432
}
431433
}
432434

svd-rs/src/registerinfo.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::{
2-
Access, BuildError, DimElement, EmptyToNone, Field, ModifiedWriteValues, OptIter, ReadAction,
3-
Register, RegisterProperties, SvdError, ValidateLevel, WriteConstraint,
2+
Access, BuildError, DimElement, EmptyToNone, Field, ModifiedWriteValues, ReadAction, Register,
3+
RegisterProperties, SvdError, ValidateLevel, WriteConstraint,
44
};
55

66
/// Errors from [`RegisterInfo::validate`]
@@ -330,13 +330,19 @@ impl RegisterInfo {
330330
}
331331

332332
/// Returns iterator over child fields
333-
pub fn fields(&self) -> OptIter<std::slice::Iter<Field>> {
334-
OptIter::new(self.fields.as_ref().map(|fields| fields.iter()))
333+
pub fn fields(&self) -> std::slice::Iter<Field> {
334+
match &self.fields {
335+
Some(fields) => fields.iter(),
336+
None => [].iter(),
337+
}
335338
}
336339

337340
/// Returns mutable iterator over child fields
338-
pub fn fields_mut(&mut self) -> OptIter<std::slice::IterMut<Field>> {
339-
OptIter::new(self.fields.as_mut().map(|fields| fields.iter_mut()))
341+
pub fn fields_mut(&mut self) -> std::slice::IterMut<Field> {
342+
match &mut self.fields {
343+
Some(fields) => fields.iter_mut(),
344+
None => [].iter_mut(),
345+
}
340346
}
341347

342348
/// Get field by name

0 commit comments

Comments
 (0)