Skip to content

Commit ab2c67f

Browse files
bors[bot]burrbull
andauthored
Merge #496
496: Remove useless `Variant`, use Option instead r=adamgreig a=burrbull As each `FieldReader` now has `bits` method, I think it is not an issue. Co-authored-by: Andrey Zgarbul <zgarbul.andrey@gmail.com>
2 parents ae7649b + b79a586 commit ab2c67f

File tree

3 files changed

+49
-64
lines changed

3 files changed

+49
-64
lines changed

CHANGELOG.md

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

2929
### Changed
3030

31+
- [breaking-change] remove `Variant<U, ENUM_A>`, use `Option<ENUM_A>` instead
32+
3133
- split out register size type (`RawType`) from `ResetValue` trait
3234

3335
- `anyhow` crate is used for error handling

src/generate/generic.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -223,15 +223,6 @@ impl<REG: RegisterSpec> W<REG> {
223223
}
224224
}
225225

226-
/// Used if enumerated values cover not the whole range.
227-
#[derive(Clone, Copy, PartialEq)]
228-
pub enum Variant<U, T> {
229-
/// Expected variant.
230-
Val(T),
231-
/// Raw bits.
232-
Res(U),
233-
}
234-
235226
/// Field reader.
236227
///
237228
/// Result of the `read` methods of fields.

src/generate/register.rs

Lines changed: 47 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,10 @@ pub fn render(
145145
let open = Punct::new('{', Spacing::Alone);
146146
let close = Punct::new('}', Spacing::Alone);
147147

148-
if can_read {
148+
if can_read && !r_impl_items.is_empty() {
149149
mod_items.extend(quote! {
150-
impl R #open
150+
impl R #open #r_impl_items #close
151151
});
152-
153-
mod_items.extend(r_impl_items);
154-
155-
close.to_tokens(&mut mod_items);
156152
}
157153

158154
if can_write {
@@ -163,11 +159,11 @@ pub fn render(
163159
mod_items.extend(w_impl_items);
164160

165161
mod_items.extend(quote! {
166-
#[doc = "Writes raw bits to the register."]
167-
pub unsafe fn bits(&mut self, bits: #rty) -> &mut Self {
168-
self.0.bits(bits);
169-
self
170-
}
162+
#[doc = "Writes raw bits to the register."]
163+
pub unsafe fn bits(&mut self, bits: #rty) -> &mut Self {
164+
self.0.bits(bits);
165+
self
166+
}
171167
});
172168

173169
close.to_tokens(&mut mod_items);
@@ -455,7 +451,7 @@ pub fn fields(
455451
let pc = &v.pc;
456452

457453
if has_reserved_variant {
458-
quote! { #i => Val(#name_pc_a::#pc), }
454+
quote! { #i => Some(#name_pc_a::#pc), }
459455
} else {
460456
quote! { #i => #name_pc_a::#pc, }
461457
}
@@ -465,35 +461,33 @@ pub fn fields(
465461

466462
if has_reserved_variant {
467463
arms.extend(quote! {
468-
i => Res(i),
469-
});
464+
_ => None,
465+
});
470466
} else if 1 << width.to_ty_width()? != variants.len() {
471467
arms.extend(quote! {
472-
_ => unreachable!(),
473-
});
468+
_ => unreachable!(),
469+
});
474470
}
475471

476472
if has_reserved_variant {
477473
enum_items.extend(quote! {
478-
///Get enumerated values variant
479-
#inline
480-
pub fn variant(&self) -> crate::Variant<#fty, #name_pc_a> {
481-
use crate::Variant::*;
482-
match self.bits {
483-
#arms
484-
}
485-
}
486-
});
474+
///Get enumerated values variant
475+
#inline
476+
pub fn variant(&self) -> Option<#name_pc_a> {
477+
match self.bits {
478+
#arms
479+
}
480+
}
481+
});
487482
} else {
488483
enum_items.extend(quote! {
489484
///Get enumerated values variant
490485
#inline
491486
pub fn variant(&self) -> #name_pc_a {
492-
match self.bits {
493-
#arms
494-
}
495-
}
496-
});
487+
match self.bits {
488+
#arms
489+
}
490+
}});
497491
}
498492

499493
for v in &variants {
@@ -511,12 +505,12 @@ pub fn fields(
511505

512506
let doc = format!("Checks if the value of the field is `{}`", pc);
513507
enum_items.extend(quote! {
514-
#[doc = #doc]
515-
#inline
516-
pub fn #is_variant(&self) -> bool {
517-
**self == #name_pc_a::#pc
518-
}
519-
});
508+
#[doc = #doc]
509+
#inline
510+
pub fn #is_variant(&self) -> bool {
511+
**self == #name_pc_a::#pc
512+
}
513+
});
520514
}
521515
}
522516

@@ -595,21 +589,19 @@ pub fn fields(
595589
if !variants.is_empty() {
596590
if unsafety.is_some() {
597591
proxy_items.extend(quote! {
598-
///Writes `variant` to the field
599-
#inline
600-
pub fn variant(self, variant: #name_pc_aw) -> &'a mut W {
601-
unsafe {
602-
self.#bits(variant.into())
592+
///Writes `variant` to the field
593+
#inline
594+
pub fn variant(self, variant: #name_pc_aw) -> &'a mut W {
595+
unsafe { self.#bits(variant.into()) }
603596
}
604-
}
605597
});
606598
} else {
607599
proxy_items.extend(quote! {
608-
///Writes `variant` to the field
609-
#inline
610-
pub fn variant(self, variant: #name_pc_aw) -> &'a mut W {
611-
self.#bits(variant.into())
612-
}
600+
///Writes `variant` to the field
601+
#inline
602+
pub fn variant(self, variant: #name_pc_aw) -> &'a mut W {
603+
self.#bits(variant.into())
604+
}
613605
});
614606
}
615607

@@ -619,11 +611,11 @@ pub fn fields(
619611

620612
let doc = util::escape_brackets(util::respace(&v.doc).as_ref());
621613
proxy_items.extend(quote! {
622-
#[doc = #doc]
623-
#inline
624-
pub fn #sc(self) -> &'a mut W {
625-
self.variant(#name_pc_aw::#pc)
626-
}
614+
#[doc = #doc]
615+
#inline
616+
pub fn #sc(self) -> &'a mut W {
617+
self.variant(#name_pc_aw::#pc)
618+
}
627619
});
628620
}
629621
}
@@ -650,7 +642,7 @@ pub fn fields(
650642
///Writes raw bits to the field
651643
#inline
652644
pub #unsafety fn #bits(self, value: #fty) -> &'a mut W {
653-
self.w.bits = (self.w.bits & !(#hexmask << self.offset)) | (((value as #rty) & #hexmask) << self.offset);
645+
self.w.bits = (self.w.bits & !(#hexmask << self.offset)) | ((value as #rty & #hexmask) << self.offset);
654646
self.w
655647
}
656648
}
@@ -660,7 +652,7 @@ pub fn fields(
660652
///Writes raw bits to the field
661653
#inline
662654
pub #unsafety fn #bits(self, value: #fty) -> &'a mut W {
663-
self.w.bits = (self.w.bits & !(#hexmask << #offset)) | (((value as #rty) & #hexmask) << #offset);
655+
self.w.bits = (self.w.bits & !(#hexmask << #offset)) | ((value as #rty & #hexmask) << #offset);
664656
self.w
665657
}
666658
}
@@ -669,7 +661,7 @@ pub fn fields(
669661
///Writes raw bits to the field
670662
#inline
671663
pub #unsafety fn #bits(self, value: #fty) -> &'a mut W {
672-
self.w.bits = (self.w.bits & !#hexmask) | ((value as #rty) & #hexmask);
664+
self.w.bits = (self.w.bits & !#hexmask) | (value as #rty & #hexmask);
673665
self.w
674666
}
675667
}

0 commit comments

Comments
 (0)