Skip to content

Commit c55aae8

Browse files
authored
Merge pull request #775 from rust-embedded/array_iter
iterate over arrays
2 parents 1dd3016 + 378083a commit c55aae8

File tree

4 files changed

+37
-11
lines changed

4 files changed

+37
-11
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
77

88
## [Unreleased]
99

10+
- Add iterators for register/cluster/field arrays
11+
1012
## [v0.31.1] - 2023-11-27
1113

1214
- Fix cluster arrays

ci/script.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ main() {
580580
test_patched_stm32 stm32f7x3
581581
test_patched_stm32 stm32g070
582582
test_patched_stm32 stm32g473
583-
test_patched_stm32 stm32h743
583+
test_patched_stm32 stm32h753
584584
test_patched_stm32 stm32l0x3
585585
test_patched_stm32 stm32l162
586586
test_patched_stm32 stm32l4x6

src/generate/peripheral/accessor.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use proc_macro2::{Ident, TokenStream};
1+
use proc_macro2::{Ident, Span, TokenStream};
22
use quote::{quote, ToTokens};
33

44
#[derive(Clone, Debug)]
@@ -138,12 +138,19 @@ pub struct ArrayAccessor {
138138
impl ToTokens for ArrayAccessor {
139139
fn to_tokens(&self, tokens: &mut TokenStream) {
140140
let Self { doc, name, ty, .. } = self;
141+
let name_iter = Ident::new(&format!("{name}_iter"), Span::call_site());
141142
quote! {
142143
#[doc = #doc]
143144
#[inline(always)]
144145
pub const fn #name(&self, n: usize) -> &#ty {
145146
&self.#name[n]
146147
}
148+
#[doc = "Iterator for array of:"]
149+
#[doc = #doc]
150+
#[inline(always)]
151+
pub fn #name_iter(&self) -> impl Iterator<Item=&#ty> {
152+
self.#name.iter()
153+
}
147154
}
148155
.to_tokens(tokens);
149156
}
@@ -169,13 +176,21 @@ impl ToTokens for RawArrayAccessor {
169176
dim,
170177
increment,
171178
} = self;
179+
let name_iter = Ident::new(&format!("{name}_iter"), Span::call_site());
180+
let cast = quote! { unsafe { &*(self as *const Self).cast::<u8>().add(#offset).add(#increment * n).cast() } };
172181
quote! {
173182
#[doc = #doc]
174183
#[inline(always)]
175184
pub const fn #name(&self, n: usize) -> &#ty {
176185
#[allow(clippy::no_effect)]
177186
[(); #dim][n];
178-
unsafe { &*(self as *const Self).cast::<u8>().add(#offset).add(#increment * n).cast() }
187+
#cast
188+
}
189+
#[doc = "Iterator for array of:"]
190+
#[doc = #doc]
191+
#[inline(always)]
192+
pub fn #name_iter(&self) -> impl Iterator<Item=&#ty> {
193+
(0..#dim).map(|n| #cast)
179194
}
180195
}
181196
.to_tokens(tokens);

src/generate/register.rs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -613,10 +613,10 @@ pub fn fields(
613613

614614
let brief_suffix = if let Field::Array(_, de) = &f {
615615
if let Some(range) = de.indexes_as_range() {
616-
format!("[{}-{}]", *range.start(), *range.end())
616+
format!("({}-{})", *range.start(), *range.end())
617617
} else {
618618
let suffixes: Vec<_> = de.indexes().collect();
619-
format!("[{}]", suffixes.join(","))
619+
format!("({})", suffixes.join(","))
620620
}
621621
} else {
622622
String::new()
@@ -905,19 +905,27 @@ pub fn fields(
905905
let increment = de.dim_increment;
906906
let doc = util::replace_suffix(&description, &brief_suffix);
907907
let first_name = svd::array::names(f, de).next().unwrap();
908-
let array_doc =
909-
format!("{doc}\n\nNOTE: `n` is number of field in register. `n == 0` corresponds to `{first_name}` field");
908+
let note = format!("NOTE: `n` is number of field in register. `n == 0` corresponds to `{first_name}` field");
910909
let offset_calc = calculate_offset(increment, offset, true);
911910
let value = quote! { ((self.bits >> #offset_calc) & #hexmask) #cast };
912911
let dim = unsuffixed(de.dim);
912+
let name_snake_case_iter = Ident::new(&format!("{name_snake_case}_iter"), span);
913913
r_impl_items.extend(quote! {
914-
#[doc = #array_doc]
914+
#[doc = #doc]
915+
#[doc = ""]
916+
#[doc = #note]
915917
#inline
916918
pub fn #name_snake_case(&self, n: u8) -> #reader_ty {
917919
#[allow(clippy::no_effect)]
918920
[(); #dim][n as usize];
919921
#reader_ty::new ( #value )
920922
}
923+
#[doc = "Iterator for array of:"]
924+
#[doc = #doc]
925+
#inline
926+
pub fn #name_snake_case_iter(&self) -> impl Iterator<Item = #reader_ty> + '_ {
927+
(0..#dim).map(|n| #reader_ty::new ( #value ))
928+
}
921929
});
922930

923931
for fi in svd::field::expand(f, de) {
@@ -1181,11 +1189,12 @@ pub fn fields(
11811189
let offset_calc = calculate_offset(increment, offset, false);
11821190
let doc = &util::replace_suffix(&description, &brief_suffix);
11831191
let first_name = svd::array::names(f, de).next().unwrap();
1184-
let array_doc =
1185-
format!("{doc}\n\nNOTE: `n` is number of field in register. `n == 0` corresponds to `{first_name}` field");
1192+
let note = format!("NOTE: `n` is number of field in register. `n == 0` corresponds to `{first_name}` field");
11861193
let dim = unsuffixed(de.dim);
11871194
w_impl_items.extend(quote! {
1188-
#[doc = #array_doc]
1195+
#[doc = #doc]
1196+
#[doc = ""]
1197+
#[doc = #note]
11891198
#inline
11901199
#[must_use]
11911200
pub fn #name_snake_case(&mut self, n: u8) -> #writer_ty<#regspec_ident> {

0 commit comments

Comments
 (0)