1 | /// A wrapper around a raw non-null `*mut T` that indicates that the possessor
|
2 | /// of this wrapper owns the referent. Useful for building abstractions like
|
3 | /// `Box<T>`, `Vec<T>`, `String`, and `HashMap<K, V>`.
|
4 | ///
|
5 | /// Unlike `*mut T`, `Unique<T>` behaves "as if" it were an instance of `T`.
|
6 | /// It implements `Send`/`Sync` if `T` is `Send`/`Sync`. It also implies
|
7 | /// the kind of strong aliasing guarantees an instance of `T` can expect:
|
8 | /// the referent of the pointer should not be modified without a unique path to
|
9 | /// its owning Unique.
|
10 | ///
|
11 | /// If you're uncertain of whether it's correct to use `Unique` for your purposes,
|
12 | /// consider using `NonNull`, which has weaker semantics.
|
13 | ///
|
14 | /// Unlike `*mut T`, the pointer must always be non-null, even if the pointer
|
15 | /// is never dereferenced. This is so that enums may use this forbidden value
|
16 | /// as a discriminant -- `Option<Unique<T>>` has the same size as `Unique<T>`.
|
17 | /// However the pointer may still dangle if it isn't dereferenced.
|
18 | ///
|
19 | /// Unlike `*mut T`, `Unique<T>` is covariant over `T`. This should always be correct
|
20 | /// for any type which upholds Unique's aliasing requirements.
|
21 | #[repr (transparent)]
|
22 | pub(crate) struct Unique<T: ?Sized> {
|
23 | pointer: NonNull<T>,
|
24 | _marker: PhantomData<T>,
|
25 | }
|
26 |
|
27 | /// `Unique` pointers are `Send` if `T` is `Send` because the data they
|
28 | /// reference is unaliased. Note that this aliasing invariant is
|
29 | /// unenforced by the type system; the abstraction using the
|
30 | /// `Unique` must enforce it.
|
31 | unsafe impl<T: Send + ?Sized> Send for Unique<T> {}
|
32 |
|
33 | /// `Unique` pointers are `Sync` if `T` is `Sync` because the data they
|
34 | /// reference is unaliased. Note that this aliasing invariant is
|
35 | /// unenforced by the type system; the abstraction using the
|
36 | /// `Unique` must enforce it.
|
37 | unsafe impl<T: Sync + ?Sized> Sync for Unique<T> {}
|
38 |
|
39 | impl<T: ?Sized> Unique<T> {
|
40 | /// Creates a new `Unique`.
|
41 | ///
|
42 | /// # Safety
|
43 | ///
|
44 | /// `ptr` must be non-null.
|
45 | #[inline ]
|
46 | pub const unsafe fn new_unchecked(ptr: *mut T) -> Self {
|
47 | // SAFETY: the caller must guarantee that `ptr` is non-null.
|
48 | unsafe {
|
49 | Unique {
|
50 | pointer: NonNull::new_unchecked(ptr),
|
51 | _marker: PhantomData,
|
52 | }
|
53 | }
|
54 | }
|
55 |
|
56 | /// Acquires the underlying `*mut` pointer.
|
57 | #[must_use = "`self` will be dropped if the result is not used" ]
|
58 | #[inline ]
|
59 | pub const fn as_ptr(self) -> *mut T {
|
60 | self.pointer.as_ptr()
|
61 | }
|
62 |
|
63 | /// Acquires the underlying `*mut` pointer.
|
64 | #[must_use = "`self` will be dropped if the result is not used" ]
|
65 | #[inline ]
|
66 | pub const fn as_non_null_ptr(self) -> NonNull<T> {
|
67 | self.pointer
|
68 | }
|
69 |
|
70 | /// Dereferences the content.
|
71 | ///
|
72 | /// The resulting lifetime is bound to self so this behaves "as if"
|
73 | /// it were actually an instance of T that is getting borrowed. If a longer
|
74 | /// (unbound) lifetime is needed, use `&*my_ptr.as_ptr()`.
|
75 | #[must_use ]
|
76 | #[inline ]
|
77 | pub const unsafe fn as_ref(&self) -> &T {
|
78 | // SAFETY: the caller must guarantee that `self` meets all the
|
79 | // requirements for a reference.
|
80 | unsafe { &*(self.as_ptr() as *const T) }
|
81 | }
|
82 |
|
83 | /// Mutably dereferences the content.
|
84 | ///
|
85 | /// The resulting lifetime is bound to self so this behaves "as if"
|
86 | /// it were actually an instance of T that is getting borrowed. If a longer
|
87 | /// (unbound) lifetime is needed, use `&mut *my_ptr.as_ptr()`.
|
88 | #[must_use ]
|
89 | #[inline ]
|
90 | pub unsafe fn as_mut(&mut self) -> &mut T {
|
91 | // SAFETY: the caller must guarantee that `self` meets all the
|
92 | // requirements for a mutable reference.
|
93 | unsafe { self.pointer.as_mut() }
|
94 | }
|
95 | }
|
96 |
|
97 | impl<T: ?Sized> Clone for Unique<T> {
|
98 | #[inline ]
|
99 | fn clone(&self) -> Self {
|
100 | *self
|
101 | }
|
102 | }
|
103 |
|
104 | impl<T: ?Sized> Copy for Unique<T> {}
|
105 |
|
106 | use core::{marker::PhantomData, ptr::NonNull};
|
107 | |