Skip to content

Commit 3e574ab

Browse files
committed
make all methods take owned versions & implement Copy
1 parent b525f38 commit 3e574ab

File tree

2 files changed

+81
-67
lines changed

2 files changed

+81
-67
lines changed

src/lib.rs

Lines changed: 62 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ where
207207
/// let mut_reference = unsafe { VolatilePtr::new_read_write(NonNull::from(&mut value)) };
208208
/// assert_eq!(mut_reference.read(), 50);
209209
/// ```
210-
pub fn read(&self) -> T
210+
pub fn read(self) -> T
211211
where
212212
R: access::Safe,
213213
{
@@ -234,7 +234,7 @@ where
234234
///
235235
/// assert_eq!(volatile.read(), 50);
236236
/// ```
237-
pub fn write(&mut self, value: T)
237+
pub fn write(self, value: T)
238238
where
239239
W: access::Safe,
240240
{
@@ -259,7 +259,7 @@ where
259259
///
260260
/// assert_eq!(volatile.read(), 43);
261261
/// ```
262-
pub fn update<F>(&mut self, f: F)
262+
pub fn update<F>(self, f: F)
263263
where
264264
R: access::Safe,
265265
W: access::Safe,
@@ -300,13 +300,13 @@ where
300300
///
301301
/// assert_eq!(unsafe { *unwrapped }, 50); // non volatile access, be careful!
302302
/// ```
303-
pub fn as_ptr(&self) -> NonNull<T> {
303+
pub fn as_ptr(self) -> NonNull<T> {
304304
self.pointer
305305
}
306306
}
307307

308308
/// Transformation methods for accessing struct fields
309-
impl<T, R, W> VolatilePtr<'_, T, Access<R, W>>
309+
impl<'a, T, R, W> VolatilePtr<'a, T, Access<R, W>>
310310
where
311311
T: ?Sized,
312312
{
@@ -351,7 +351,7 @@ where
351351
/// value
352352
/// })};
353353
/// ```
354-
pub unsafe fn map<'a, F, U>(&'a self, f: F) -> VolatilePtr<'a, U, Access<R, access::NoAccess>>
354+
pub unsafe fn map<F, U>(self, f: F) -> VolatilePtr<'a, U, Access<R, access::NoAccess>>
355355
where
356356
F: FnOnce(NonNull<T>) -> NonNull<U>,
357357
U: ?Sized,
@@ -360,8 +360,8 @@ where
360360
}
361361

362362
#[cfg(feature = "very_unstable")]
363-
pub const unsafe fn map_const<'a, F, U>(
364-
&'a self,
363+
pub const unsafe fn map_const<F, U>(
364+
self,
365365
f: F,
366366
) -> VolatilePtr<'a, U, Access<R, access::NoAccess>>
367367
where
@@ -371,7 +371,7 @@ where
371371
unsafe { VolatilePtr::new_generic(f(self.pointer)) }
372372
}
373373

374-
pub unsafe fn map_mut<F, U>(&mut self, f: F) -> VolatilePtr<U, Access<R, W>>
374+
pub unsafe fn map_mut<F, U>(self, f: F) -> VolatilePtr<'a, U, Access<R, W>>
375375
where
376376
F: FnOnce(NonNull<T>) -> NonNull<U>,
377377
U: ?Sized,
@@ -380,7 +380,7 @@ where
380380
}
381381

382382
#[cfg(feature = "very_unstable")]
383-
pub const unsafe fn map_mut_const<F, U>(&mut self, f: F) -> VolatilePtr<U, Access<R, W>>
383+
pub const unsafe fn map_mut_const<F, U>(self, f: F) -> VolatilePtr<'a, U, Access<R, W>>
384384
where
385385
F: FnOnce(NonNull<T>) -> NonNull<U>,
386386
U: ?Sized,
@@ -392,7 +392,7 @@ where
392392
/// Methods for volatile slices
393393
#[cfg(feature = "unstable")]
394394
impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
395-
pub fn len(&self) -> usize {
395+
pub fn len(self) -> usize {
396396
self.pointer.len()
397397
}
398398

@@ -433,9 +433,9 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
433433
/// assert_eq!(subslice.index(0).read(), 2);
434434
/// ```
435435
pub fn index<I>(
436-
&self,
436+
self,
437437
index: I,
438-
) -> VolatilePtr<<I as SliceIndex<[T]>>::Output, Access<R, access::NoAccess>>
438+
) -> VolatilePtr<'a, <I as SliceIndex<[T]>>::Output, Access<R, access::NoAccess>>
439439
where
440440
I: SliceIndex<[T]> + SliceIndex<[()]> + Clone,
441441
{
@@ -445,7 +445,10 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
445445
}
446446

447447
#[cfg(feature = "very_unstable")]
448-
pub const fn index_const(&self, index: usize) -> VolatilePtr<T, Access<R, access::NoAccess>> {
448+
pub const fn index_const(
449+
self,
450+
index: usize,
451+
) -> VolatilePtr<'a, T, Access<R, access::NoAccess>> {
449452
assert!(index < self.pointer.len(), "index out of bounds");
450453
unsafe {
451454
self.map_const(|slice| {
@@ -455,9 +458,9 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
455458
}
456459

457460
pub fn index_mut<I>(
458-
&mut self,
461+
self,
459462
index: I,
460-
) -> VolatilePtr<<I as SliceIndex<[T]>>::Output, Access<R, W>>
463+
) -> VolatilePtr<'a, <I as SliceIndex<[T]>>::Output, Access<R, W>>
461464
where
462465
I: SliceIndex<[T]> + SliceIndex<[()]> + Clone,
463466
{
@@ -467,7 +470,7 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
467470
}
468471

469472
#[cfg(feature = "very_unstable")]
470-
pub const fn index_mut_const(&mut self, index: usize) -> VolatilePtr<T, Access<R, W>> {
473+
pub const fn index_mut_const(self, index: usize) -> VolatilePtr<'a, T, Access<R, W>> {
471474
assert!(index < self.pointer.len(), "index out of bounds");
472475
unsafe {
473476
self.map_mut_const(|slice| {
@@ -510,7 +513,7 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
510513
/// assert_eq!(src, [1, 2]);
511514
/// assert_eq!(dst, [5, 1, 2]);
512515
/// ```
513-
pub fn copy_into_slice(&self, dst: &mut [T])
516+
pub fn copy_into_slice(self, dst: &mut [T])
514517
where
515518
T: Copy,
516519
{
@@ -566,7 +569,7 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
566569
/// assert_eq!(src, [1, 2, 3, 4]);
567570
/// assert_eq!(dst, [3, 4]);
568571
/// ```
569-
pub fn copy_from_slice(&mut self, src: &[T])
572+
pub fn copy_from_slice(self, src: &[T])
570573
where
571574
T: Copy,
572575
{
@@ -619,7 +622,7 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
619622
/// volatile.copy_within(1..5, 8);
620623
///
621624
/// assert_eq!(&byte_array, b"Hello, Wello!");
622-
pub fn copy_within(&mut self, src: impl RangeBounds<usize>, dest: usize)
625+
pub fn copy_within(self, src: impl RangeBounds<usize>, dest: usize)
623626
where
624627
T: Copy,
625628
{
@@ -643,11 +646,11 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
643646
}
644647

645648
pub fn split_at(
646-
&self,
649+
self,
647650
mid: usize,
648651
) -> (
649-
VolatilePtr<[T], Access<R, access::NoAccess>>,
650-
VolatilePtr<[T], Access<R, access::NoAccess>>,
652+
VolatilePtr<'a, [T], Access<R, access::NoAccess>>,
653+
VolatilePtr<'a, [T], Access<R, access::NoAccess>>,
651654
) {
652655
assert!(mid <= self.pointer.len());
653656
// SAFETY: `[ptr; mid]` and `[mid; len]` are inside `self`, which
@@ -656,11 +659,11 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
656659
}
657660

658661
pub fn split_at_mut(
659-
&mut self,
662+
self,
660663
mid: usize,
661664
) -> (
662-
VolatilePtr<[T], Access<R, W>>,
663-
VolatilePtr<[T], Access<R, W>>,
665+
VolatilePtr<'a, [T], Access<R, W>>,
666+
VolatilePtr<'a, [T], Access<R, W>>,
664667
) {
665668
assert!(mid <= self.pointer.len());
666669
// SAFETY: `[ptr; mid]` and `[mid; len]` are inside `self`, which
@@ -669,11 +672,11 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
669672
}
670673

671674
unsafe fn split_at_unchecked(
672-
&self,
675+
self,
673676
mid: usize,
674677
) -> (
675-
VolatilePtr<[T], Access<R, access::NoAccess>>,
676-
VolatilePtr<[T], Access<R, access::NoAccess>>,
678+
VolatilePtr<'a, [T], Access<R, access::NoAccess>>,
679+
VolatilePtr<'a, [T], Access<R, access::NoAccess>>,
677680
) {
678681
// SAFETY: Caller has to check that `0 <= mid <= self.len()`
679682
unsafe {
@@ -685,11 +688,11 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
685688
}
686689

687690
unsafe fn split_at_mut_unchecked(
688-
&mut self,
691+
self,
689692
mid: usize,
690693
) -> (
691-
VolatilePtr<[T], Access<R, W>>,
692-
VolatilePtr<[T], Access<R, W>>,
694+
VolatilePtr<'a, [T], Access<R, W>>,
695+
VolatilePtr<'a, [T], Access<R, W>>,
693696
) {
694697
let len = self.pointer.len();
695698
let ptr = self.pointer.as_mut_ptr();
@@ -711,10 +714,10 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
711714
}
712715

713716
pub fn as_chunks<const N: usize>(
714-
&self,
717+
self,
715718
) -> (
716-
VolatilePtr<[[T; N]], Access<R, access::NoAccess>>,
717-
VolatilePtr<[T], Access<R, access::NoAccess>>,
719+
VolatilePtr<'a, [[T; N]], Access<R, access::NoAccess>>,
720+
VolatilePtr<'a, [T], Access<R, access::NoAccess>>,
718721
) {
719722
assert_ne!(N, 0);
720723
let len = self.pointer.len() / N;
@@ -726,8 +729,8 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
726729
}
727730

728731
pub unsafe fn as_chunks_unchecked<const N: usize>(
729-
&self,
730-
) -> VolatilePtr<[[T; N]], Access<R, access::NoAccess>> {
732+
self,
733+
) -> VolatilePtr<'a, [[T; N]], Access<R, access::NoAccess>> {
731734
debug_assert_ne!(N, 0);
732735
debug_assert_eq!(self.pointer.len() % N, 0);
733736
let new_len =
@@ -744,10 +747,10 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
744747
}
745748

746749
pub fn as_chunks_mut<const N: usize>(
747-
&mut self,
750+
self,
748751
) -> (
749-
VolatilePtr<[[T; N]], Access<R, W>>,
750-
VolatilePtr<[T], Access<R, W>>,
752+
VolatilePtr<'a, [[T; N]], Access<R, W>>,
753+
VolatilePtr<'a, [T], Access<R, W>>,
751754
) {
752755
assert_ne!(N, 0);
753756
let len = self.pointer.len() / N;
@@ -759,8 +762,8 @@ impl<'a, T, R, W> VolatilePtr<'a, [T], Access<R, W>> {
759762
}
760763

761764
pub unsafe fn as_chunks_unchecked_mut<const N: usize>(
762-
&mut self,
763-
) -> VolatilePtr<[[T; N]], Access<R, W>> {
765+
self,
766+
) -> VolatilePtr<'a, [[T; N]], Access<R, W>> {
764767
debug_assert_ne!(N, 0);
765768
debug_assert_eq!(self.pointer.len() % N, 0);
766769
let new_len =
@@ -819,7 +822,7 @@ impl<A> VolatilePtr<'_, [u8], A> {
819822
/// buf.fill(1);
820823
/// assert_eq!(unsafe { buf.as_ptr().as_mut() }, &mut vec![1; 10]);
821824
/// ```
822-
pub fn fill(&mut self, value: u8) {
825+
pub fn fill(self, value: u8) {
823826
unsafe {
824827
intrinsics::volatile_set_memory(self.pointer.as_mut_ptr(), value, self.pointer.len());
825828
}
@@ -831,7 +834,7 @@ impl<A> VolatilePtr<'_, [u8], A> {
831834
/// These methods are only available with the `unstable` feature enabled (requires a nightly
832835
/// Rust compiler).
833836
#[cfg(feature = "unstable")]
834-
impl<T, R, W, const N: usize> VolatilePtr<'_, [T; N], Access<R, W>> {
837+
impl<'a, T, R, W, const N: usize> VolatilePtr<'a, [T; N], Access<R, W>> {
835838
/// Converts an array reference to a shared slice.
836839
///
837840
/// This makes it possible to use the methods defined on slices.
@@ -856,7 +859,7 @@ impl<T, R, W, const N: usize> VolatilePtr<'_, [T; N], Access<R, W>> {
856859
///
857860
/// assert_eq!(dst, [1, 2]);
858861
/// ```
859-
pub fn as_slice(&self) -> VolatilePtr<[T], Access<R, access::NoAccess>> {
862+
pub fn as_slice(self) -> VolatilePtr<'a, [T], Access<R, access::NoAccess>> {
860863
unsafe {
861864
self.map(|array| {
862865
NonNull::new(ptr::slice_from_raw_parts_mut(array.as_ptr() as *mut T, N)).unwrap()
@@ -920,21 +923,21 @@ impl<T, R, W> VolatilePtr<'_, T, Access<R, W>>
920923
where
921924
T: Copy + ?Sized,
922925
{
923-
pub unsafe fn read_unsafe(&self) -> T
926+
pub unsafe fn read_unsafe(self) -> T
924927
where
925928
R: access::Unsafe,
926929
{
927930
unsafe { ptr::read_volatile(self.pointer.as_ptr()) }
928931
}
929932

930-
pub unsafe fn write_unsafe(&mut self, value: T)
933+
pub unsafe fn write_unsafe(self, value: T)
931934
where
932935
W: access::Unsafe,
933936
{
934937
unsafe { ptr::write_volatile(self.pointer.as_ptr(), value) };
935938
}
936939

937-
pub unsafe fn update_unsafe<F>(&mut self, f: F)
940+
pub unsafe fn update_unsafe<F>(self, f: F)
938941
where
939942
R: access::Unsafe,
940943
W: access::Unsafe,
@@ -946,6 +949,17 @@ where
946949
}
947950
}
948951

952+
impl<'a, T, A> Clone for VolatilePtr<'a, T, A>
953+
where
954+
T: ?Sized,
955+
{
956+
fn clone(&self) -> Self {
957+
*self
958+
}
959+
}
960+
961+
impl<'a, T, A> Copy for VolatilePtr<'a, T, A> where T: ?Sized {}
962+
949963
impl<T, W> fmt::Debug for VolatilePtr<'_, T, Access<access::SafeAccess, W>>
950964
where
951965
T: Copy + fmt::Debug + ?Sized,

0 commit comments

Comments
 (0)