Skip to content

Commit d0c3e9e

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

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

src/volatile_ptr/operations.rs

+24-2
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,28 @@ 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+
///
230+
/// let mut value: i16 = -4;
231+
/// let mut volatile = unsafe { VolatilePtr::new((&mut value).into()) };
232+
///
233+
/// let read_only = volatile.restrict::<ReadOnly>();
234+
/// assert_eq!(read_only.read(), -4);
235+
/// // read_only.write(10); // compile-time error
236+
/// ```
237+
pub fn restrict<A>(self) -> VolatilePtr<'a, T, A>
238+
where
239+
A: Access,
240+
{
241+
unsafe { VolatilePtr::new_restricted(Default::default(), self.pointer) }
242+
}
243+
222244
/// Restricts access permissions to read-only.
223245
///
224246
/// ## Example
@@ -235,7 +257,7 @@ where
235257
/// // read_only.write(10); // compile-time error
236258
/// ```
237259
pub fn read_only(self) -> VolatilePtr<'a, T, ReadOnly> {
238-
unsafe { VolatilePtr::new_restricted(ReadOnly, self.pointer) }
260+
self.restrict()
239261
}
240262

241263
/// Restricts access permissions to write-only.
@@ -258,6 +280,6 @@ where
258280
/// // field_2.read(); // compile-time error
259281
/// ```
260282
pub fn write_only(self) -> VolatilePtr<'a, T, WriteOnly> {
261-
unsafe { VolatilePtr::new_restricted(WriteOnly, self.pointer) }
283+
self.restrict()
262284
}
263285
}

src/volatile_ref.rs

+24-2
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,28 @@ 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+
///
185+
/// let mut value: i16 = -4;
186+
/// let mut volatile = VolatileRef::from_mut_ref(&mut value);
187+
///
188+
/// let read_only = volatile.restrict::<ReadOnly>();
189+
/// assert_eq!(read_only.as_ptr().read(), -4);
190+
/// // read_only.as_ptr().write(10); // compile-time error
191+
/// ```
192+
pub fn restrict<A>(self) -> VolatileRef<'a, T, A>
193+
where
194+
A: Access,
195+
{
196+
unsafe { VolatileRef::new_restricted(Default::default(), self.pointer) }
197+
}
198+
177199
/// Restricts access permissions to read-only.
178200
///
179201
/// ## Example
@@ -190,7 +212,7 @@ where
190212
/// // read_only.as_ptr().write(10); // compile-time error
191213
/// ```
192214
pub fn read_only(self) -> VolatileRef<'a, T, ReadOnly> {
193-
unsafe { VolatileRef::new_restricted(ReadOnly, self.pointer) }
215+
self.restrict()
194216
}
195217

196218
/// Restricts access permissions to write-only.
@@ -212,7 +234,7 @@ where
212234
/// // write_only.as_ptr().read(); // compile-time error
213235
/// ```
214236
pub fn write_only(self) -> VolatileRef<'a, T, WriteOnly> {
215-
unsafe { VolatileRef::new_restricted(WriteOnly, self.pointer) }
237+
self.restrict()
216238
}
217239
}
218240

0 commit comments

Comments
 (0)