Skip to content

Commit d9e06a7

Browse files
committed
Use newtype wrappers to clean up docs
1 parent 5356990 commit d9e06a7

File tree

2 files changed

+117
-28
lines changed

2 files changed

+117
-28
lines changed

src/generate/generic.rs

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,19 @@ pub trait RegisterSpec {
99
/// Trait implemented by readable registers to enable the `read` method.
1010
///
1111
/// Registers marked with `Writable` can be also `modify`'ed.
12-
pub trait Readable: RegisterSpec {}
12+
pub trait Readable: RegisterSpec {
13+
/// Result from a call to `read` and argument to `modify`.
14+
type Reader: core::convert::From<R<Self>> + core::ops::Deref<Target = R<Self>>;
15+
}
1316

1417
/// Trait implemented by writeable registers.
1518
///
1619
/// This enables the `write`, `write_with_zero` and `reset` methods.
1720
///
1821
/// Registers marked with `Readable` can be also `modify`'ed.
19-
pub trait Writable: RegisterSpec {}
22+
pub trait Writable: RegisterSpec {
23+
type Writer: core::convert::From<W<Self>> + core::ops::Deref<Target = W<Self>>;
24+
}
2025

2126
/// Reset value of the register.
2227
///
@@ -61,11 +66,11 @@ impl<REG: Readable> Reg<REG> {
6166
/// let flag = reader.field2().bit_is_set();
6267
/// ```
6368
#[inline(always)]
64-
pub fn read(&self) -> R<REG> {
65-
R {
69+
pub fn read(&self) -> REG::Reader {
70+
REG::Reader::from(R {
6671
bits: self.register.get(),
6772
_reg: marker::PhantomData,
68-
}
73+
})
6974
}
7075
}
7176

@@ -96,13 +101,13 @@ impl<REG: Resettable + Writable> Reg<REG> {
96101
#[inline(always)]
97102
pub fn write<F>(&self, f: F)
98103
where
99-
F: FnOnce(&mut W<REG>) -> &mut W<REG>,
104+
F: FnOnce(&mut REG::Writer) -> &mut REG::Writer,
100105
{
101106
self.register.set(
102-
f(&mut W {
107+
f(&mut REG::Writer::from(W {
103108
bits: REG::reset_value(),
104109
_reg: marker::PhantomData,
105-
})
110+
}))
106111
.bits,
107112
);
108113
}
@@ -118,13 +123,13 @@ where
118123
#[inline(always)]
119124
pub fn write_with_zero<F>(&self, f: F)
120125
where
121-
F: FnOnce(&mut W<REG>) -> &mut W<REG>,
126+
F: FnOnce(&mut REG::Writer) -> &mut REG::Writer,
122127
{
123128
self.register.set(
124-
f(&mut W {
129+
(*f(&mut REG::Writer::from(W {
125130
bits: REG::Ux::default(),
126131
_reg: marker::PhantomData,
127-
})
132+
})))
128133
.bits,
129134
);
130135
}
@@ -151,19 +156,19 @@ impl<REG: Readable + Writable> Reg<REG> {
151156
#[inline(always)]
152157
pub fn modify<F>(&self, f: F)
153158
where
154-
for<'w> F: FnOnce(&R<REG>, &'w mut W<REG>) -> &'w mut W<REG>,
159+
for<'w> F: FnOnce(&REG::Reader, &'w mut REG::Writer) -> &'w mut REG::Writer,
155160
{
156161
let bits = self.register.get();
157162
self.register.set(
158163
f(
159-
&R {
164+
&REG::Reader::from(R {
160165
bits,
161166
_reg: marker::PhantomData,
162-
},
163-
&mut W {
167+
}),
168+
&mut REG::Writer::from(W {
164169
bits,
165170
_reg: marker::PhantomData,
166-
},
171+
}),
167172
)
168173
.bits,
169174
);
@@ -174,7 +179,7 @@ impl<REG: Readable + Writable> Reg<REG> {
174179
///
175180
/// Result of the `read` methods of registers. Also used as a closure argument in the `modify`
176181
/// method.
177-
pub struct R<REG: RegisterSpec> {
182+
pub struct R<REG: RegisterSpec + ?Sized> {
178183
pub(crate) bits: REG::Ux,
179184
_reg: marker::PhantomData<REG>,
180185
}
@@ -201,7 +206,7 @@ where
201206
/// Register writer.
202207
///
203208
/// Used as an argument to the closures in the `write` and `modify` methods of the register.
204-
pub struct W<REG: RegisterSpec> {
209+
pub struct W<REG: RegisterSpec + ?Sized> {
205210
///Writable bits
206211
pub(crate) bits: REG::Ux,
207212
_reg: marker::PhantomData<REG>,
@@ -210,9 +215,8 @@ pub struct W<REG: RegisterSpec> {
210215
impl<REG: RegisterSpec> W<REG> {
211216
/// Writes raw bits to the register.
212217
#[inline(always)]
213-
pub unsafe fn bits(&mut self, bits: REG::Ux) -> &mut Self {
218+
pub unsafe fn bits(&mut self, bits: REG::Ux) {
214219
self.bits = bits;
215-
self
216220
}
217221
}
218222

src/generate/register.rs

Lines changed: 93 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,21 @@ pub fn render(
5757
let desc = format!("Reader of register {}", register.name);
5858
mod_items.extend(quote! {
5959
#[doc = #desc]
60-
pub type R = crate::R<#name_uc_spec>;
60+
pub struct R(crate::R<#name_uc_spec>);
61+
62+
impl core::ops::Deref for R {
63+
type Target = crate::R<#name_uc_spec>;
64+
65+
fn deref(&self) -> &Self::Target {
66+
&self.0
67+
}
68+
}
69+
70+
impl core::convert::From<crate::R<#name_uc_spec>> for R {
71+
fn from(reader: crate::R<#name_uc_spec>) -> Self {
72+
R(reader)
73+
}
74+
}
6175
});
6276
methods.push("read");
6377
}
@@ -66,7 +80,34 @@ pub fn render(
6680
let desc = format!("Writer for register {}", register.name);
6781
mod_items.extend(quote! {
6882
#[doc = #desc]
69-
pub type W = crate::W<#name_uc_spec>;
83+
pub struct W(crate::W<#name_uc_spec>);
84+
85+
impl W {
86+
pub unsafe fn bits(&mut self, bits: #rty) -> &mut Self {
87+
self.0.bits(bits);
88+
self
89+
}
90+
}
91+
92+
impl core::ops::Deref for W {
93+
type Target = crate::W<#name_uc_spec>;
94+
95+
fn deref(&self) -> &Self::Target {
96+
&self.0
97+
}
98+
}
99+
100+
impl core::ops::DerefMut for W {
101+
fn deref_mut(&mut self) -> &mut Self::Target {
102+
&mut self.0
103+
}
104+
}
105+
106+
impl core::convert::From<crate::W<#name_uc_spec>> for W {
107+
fn from(writer: crate::W<#name_uc_spec>) -> Self {
108+
W(writer)
109+
}
110+
}
70111
});
71112
methods.push("write_with_zero");
72113
if can_reset {
@@ -167,7 +208,9 @@ pub fn render(
167208
);
168209
mod_items.extend(quote! {
169210
#[doc = #doc]
170-
impl crate::Readable for #name_uc_spec {}
211+
impl crate::Readable for #name_uc_spec {
212+
type Reader = R;
213+
}
171214
});
172215
}
173216
if can_write {
@@ -177,7 +220,9 @@ pub fn render(
177220
);
178221
mod_items.extend(quote! {
179222
#[doc = #doc]
180-
impl crate::Writable for #name_uc_spec {}
223+
impl crate::Writable for #name_uc_spec {
224+
type Writer = W;
225+
}
181226
});
182227
}
183228
if let Some(rv) = res_val.map(util::hex) {
@@ -388,7 +433,21 @@ pub fn fields(
388433

389434
mod_items.extend(quote! {
390435
#[doc = #readerdoc]
391-
pub type #name_pc_r = crate::FieldReader<#fty, #name_pc_a>;
436+
pub struct #name_pc_r(crate::FieldReader<#fty, #name_pc_a>);
437+
438+
impl #name_pc_r {
439+
pub(crate) fn new(bits: #fty) -> Self {
440+
#name_pc_r(crate::FieldReader::new(bits))
441+
}
442+
}
443+
444+
impl core::ops::Deref for #name_pc_r {
445+
type Target = crate::FieldReader<#fty, #name_pc_a>;
446+
447+
fn deref(&self) -> &Self::Target {
448+
&self.0
449+
}
450+
}
392451
});
393452
} else {
394453
let has_reserved_variant = evs.values.len() != (1 << width);
@@ -463,23 +522,49 @@ pub fn fields(
463522
#[doc = #doc]
464523
#inline
465524
pub fn #is_variant(&self) -> bool {
466-
*self == #name_pc_a::#pc
525+
**self == #name_pc_a::#pc
467526
}
468527
});
469528
}
470529

471530
mod_items.extend(quote! {
472531
#[doc = #readerdoc]
473-
pub type #name_pc_r = crate::FieldReader<#fty, #name_pc_a>;
532+
pub struct #name_pc_r(crate::FieldReader<#fty, #name_pc_a>);
533+
474534
impl #name_pc_r {
535+
pub(crate) fn new(bits: #fty) -> Self {
536+
#name_pc_r(crate::FieldReader::new(bits))
537+
}
475538
#enum_items
476539
}
540+
541+
impl core::ops::Deref for #name_pc_r {
542+
type Target = crate::FieldReader<#fty, #name_pc_a>;
543+
544+
fn deref(&self) -> &Self::Target {
545+
&self.0
546+
}
547+
}
477548
});
478549
}
479550
} else {
480551
mod_items.extend(quote! {
481552
#[doc = #readerdoc]
482-
pub type #name_pc_r = crate::FieldReader<#fty, #fty>;
553+
pub struct #name_pc_r(crate::FieldReader<#fty, #fty>);
554+
555+
impl #name_pc_r {
556+
pub(crate) fn new(bits: #fty) -> Self {
557+
#name_pc_r(crate::FieldReader::new(bits))
558+
}
559+
}
560+
561+
impl core::ops::Deref for #name_pc_r {
562+
type Target = crate::FieldReader<#fty, #fty>;
563+
564+
fn deref(&self) -> &Self::Target {
565+
&self.0
566+
}
567+
}
483568
})
484569
}
485570
}

0 commit comments

Comments
 (0)