Skip to content

Commit 824ae6d

Browse files
committed
Add VolatileRef::restrict and VolatilePtr::restrict
Signed-off-by: Martin Kröning <[email protected]>
1 parent 2252916 commit 824ae6d

File tree

2 files changed

+50
-4
lines changed

2 files changed

+50
-4
lines changed

src/volatile_ptr/operations.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,29 @@ impl<'a, T> VolatilePtr<'a, T, ReadWrite>
219219
where
220220
T: ?Sized,
221221
{
222+
/// Restricts access permissions to `A`.
223+
///
224+
/// ## Example
225+
///
226+
/// ```
227+
/// use volatile::access::ReadOnly;
228+
/// use volatile::VolatilePtr;
229+
/// use core::ptr::NonNull;
230+
///
231+
/// let mut value: i16 = -4;
232+
/// let mut volatile = unsafe { VolatilePtr::new((&mut value).into()) };
233+
///
234+
/// let read_only = volatile.restrict::<ReadOnly>();
235+
/// assert_eq!(read_only.read(), -4);
236+
/// // read_only.write(10); // compile-time error
237+
/// ```
238+
pub fn restrict<A>(self) -> VolatilePtr<'a, T, A>
239+
where
240+
A: Access,
241+
{
242+
unsafe { VolatilePtr::new_restricted(Default::default(), self.pointer) }
243+
}
244+
222245
/// Restricts access permissions to read-only.
223246
///
224247
/// ## Example
@@ -235,7 +258,7 @@ where
235258
/// // read_only.write(10); // compile-time error
236259
/// ```
237260
pub fn read_only(self) -> VolatilePtr<'a, T, ReadOnly> {
238-
unsafe { VolatilePtr::new_restricted(ReadOnly, self.pointer) }
261+
self.restrict()
239262
}
240263

241264
/// Restricts access permissions to write-only.
@@ -258,6 +281,6 @@ where
258281
/// // field_2.read(); // compile-time error
259282
/// ```
260283
pub fn write_only(self) -> VolatilePtr<'a, T, WriteOnly> {
261-
unsafe { VolatilePtr::new_restricted(WriteOnly, self.pointer) }
284+
self.restrict()
262285
}
263286
}

src/volatile_ref.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,29 @@ impl<'a, T> VolatileRef<'a, T, ReadWrite>
174174
where
175175
T: ?Sized,
176176
{
177+
/// Restricts access permissions to `A`.
178+
///
179+
/// ## Example
180+
///
181+
/// ```
182+
/// use volatile::access::ReadOnly;
183+
/// use volatile::VolatileRef;
184+
/// use core::ptr::NonNull;
185+
///
186+
/// let mut value: i16 = -4;
187+
/// let mut volatile = VolatileRef::from_mut_ref(&mut value);
188+
///
189+
/// let read_only = volatile.restrict::<ReadOnly>();
190+
/// assert_eq!(read_only.as_ptr().read(), -4);
191+
/// // read_only.as_ptr().write(10); // compile-time error
192+
/// ```
193+
pub fn restrict<A>(self) -> VolatileRef<'a, T, A>
194+
where
195+
A: Access,
196+
{
197+
unsafe { VolatileRef::new_restricted(Default::default(), self.pointer) }
198+
}
199+
177200
/// Restricts access permissions to read-only.
178201
///
179202
/// ## Example
@@ -190,7 +213,7 @@ where
190213
/// // read_only.as_ptr().write(10); // compile-time error
191214
/// ```
192215
pub fn read_only(self) -> VolatileRef<'a, T, ReadOnly> {
193-
unsafe { VolatileRef::new_restricted(ReadOnly, self.pointer) }
216+
self.restrict()
194217
}
195218

196219
/// Restricts access permissions to write-only.
@@ -212,7 +235,7 @@ where
212235
/// // write_only.as_ptr().read(); // compile-time error
213236
/// ```
214237
pub fn write_only(self) -> VolatileRef<'a, T, WriteOnly> {
215-
unsafe { VolatileRef::new_restricted(WriteOnly, self.pointer) }
238+
self.restrict()
216239
}
217240
}
218241

0 commit comments

Comments
 (0)