1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
use crate::convert::From;
use crate::fmt;
use crate::marker::{PhantomData, Unsize};
use crate::ops::{CoerceUnsized, DispatchFromDyn};
use crate::ptr::NonNull;
/// 原始非空 `*mut T` 周围的包装器,指示该包装器的拥有者拥有引用对象。
/// 对于构建 `Box<T>`,`Vec<T>`,`String` 和 `HashMap<K, V>` 等抽象很有用。
///
/// 与 `*mut T` 不同,`Unique<T>` 的行为与 "as if" 相同,它是 `T` 的实例。
/// 如果 `T` 为 `Send`/`Sync`,则实现 `Send`/`Sync`。
/// 这也暗示了 `T` 实例可以期望的那种强别名保证:
/// 如果没有指向其所属 `unique` 的唯一路径,则不应修改指针的引用对象。
///
/// 如果不确定使用 `Unique` 是否正确,请考虑使用语义较弱的 `NonNull`。
///
///
/// 与 `*mut T` 不同,即使从未解引用指针,指针也必须始终为非 null。
/// 这样一来,枚举就可以将此禁止值用作判别式 - `Option<Unique<T>>` 与 `Unique<T>` 具有相同的大小。
/// 但是,如果指针未解引用,它可能仍会悬垂。
///
/// 与 `*mut T` 不同,`Unique<T>` 在 `T` 上是协变的。
/// 对于任何符合 `Unique` 别名要求的类型,这应该总是正确的。
///
///
///
#[unstable(
feature = "ptr_internals",
issue = "none",
reason = "use `NonNull` instead and consider `PhantomData<T>` \
(if you also use `#[may_dangle]`), `Send`, and/or `Sync`"
)]
#[doc(hidden)]
#[repr(transparent)]
pub struct Unique<T: ?Sized> {
pointer: NonNull<T>,
// NOTE: 此标记不会对差异产生任何影响,但对于 dropck 来说,了解我们在逻辑上拥有 `T` 是必需的。
//
//
// 有关详细信息,请参见:
// https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md#phantom-data
_marker: PhantomData<T>,
}
/// 如果 `T` 是 `Send`,则 `Unique` 指针是 `Send`,因为它们引用的数据是无别名的。
/// 请注意,类型系统不强制使用此别名不变量。使用 `Unique` 的抽象必须强制使用它。
///
///
#[unstable(feature = "ptr_internals", issue = "none")]
unsafe impl<T: Send + ?Sized> Send for Unique<T> {}
/// 如果 `T` 是 `Sync`,则 `Unique` 指针是 `Sync`,因为它们引用的数据是无别名的。
/// 请注意,类型系统不强制使用此别名不变量。使用 `Unique` 的抽象必须强制使用它。
///
///
#[unstable(feature = "ptr_internals", issue = "none")]
unsafe impl<T: Sync + ?Sized> Sync for Unique<T> {}
#[unstable(feature = "ptr_internals", issue = "none")]
impl<T: Sized> Unique<T> {
/// 创建一个悬垂但对齐良好的新 `Unique`。
///
/// 与 `Vec::new` 一样,这对于初始化延迟分配的类型很有用。
///
/// 请注意,该指针值可能表示一个指向 `T` 的有效指针,这意味着不得将其用作 "尚未初始化" 标记值。
/// 延迟分配的类型必须通过其他某种方式来跟踪初始化。
///
///
///
#[must_use]
#[inline]
pub const fn dangling() -> Self {
// FIXME(const-hack) 替换为 `From`
Unique { pointer: NonNull::dangling(), _marker: PhantomData }
}
}
#[unstable(feature = "ptr_internals", issue = "none")]
impl<T: ?Sized> Unique<T> {
/// 创建一个新的 `Unique`。
///
/// # Safety
///
/// `ptr` 必须不能为空。
#[inline]
pub const unsafe fn new_unchecked(ptr: *mut T) -> Self {
// SAFETY: 调用者必须保证 `ptr` 不为空。
unsafe { Unique { pointer: NonNull::new_unchecked(ptr), _marker: PhantomData } }
}
/// 如果 `ptr` 不为空,则创建一个新的 `Unique`。
#[inline]
pub const fn new(ptr: *mut T) -> Option<Self> {
if let Some(pointer) = NonNull::new(ptr) {
Some(Unique { pointer, _marker: PhantomData })
} else {
None
}
}
/// 获取底层的 `*mut` 指针。
#[must_use = "`self` will be dropped if the result is not used"]
#[inline]
pub const fn as_ptr(self) -> *mut T {
self.pointer.as_ptr()
}
/// 解引用内容。
///
/// 最终的生命周期被绑定到 self 上,所以它的行为 "好像" 它实际上是一个被借用的 T 的实例。
/// 如果需要更长的 (unbound) 生命周期,请使用 `&*my_ptr.as_ptr()`。
///
#[must_use]
#[inline]
pub const unsafe fn as_ref(&self) -> &T {
// SAFETY: 调用者必须保证 `self` 满足引用的所有要求。
//
unsafe { self.pointer.as_ref() }
}
/// 相互解引用内容。
///
/// 最终的生命周期被绑定到 self 上,所以它的行为 "好像" 它实际上是一个被借用的 T 的实例。
/// 如果需要更长的 (unbound) 生命周期,请使用 `&mut *my_ptr.as_ptr()`。
///
#[must_use]
#[inline]
pub const unsafe fn as_mut(&mut self) -> &mut T {
// SAFETY: 调用者必须保证 `self` 满足可变引用的所有要求。
//
unsafe { self.pointer.as_mut() }
}
/// 强制转换为另一种类型的指针。
#[must_use = "`self` will be dropped if the result is not used"]
#[inline]
pub const fn cast<U>(self) -> Unique<U> {
// FIXME(const-hack): 替换为 `From`
// SAFETY: 是 `NonNull`
unsafe { Unique::new_unchecked(self.pointer.cast().as_ptr()) }
}
}
#[unstable(feature = "ptr_internals", issue = "none")]
impl<T: ?Sized> Clone for Unique<T> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
#[unstable(feature = "ptr_internals", issue = "none")]
impl<T: ?Sized> Copy for Unique<T> {}
#[unstable(feature = "ptr_internals", issue = "none")]
impl<T: ?Sized, U: ?Sized> CoerceUnsized<Unique<U>> for Unique<T> where T: Unsize<U> {}
#[unstable(feature = "ptr_internals", issue = "none")]
impl<T: ?Sized, U: ?Sized> DispatchFromDyn<Unique<U>> for Unique<T> where T: Unsize<U> {}
#[unstable(feature = "ptr_internals", issue = "none")]
impl<T: ?Sized> fmt::Debug for Unique<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Pointer::fmt(&self.as_ptr(), f)
}
}
#[unstable(feature = "ptr_internals", issue = "none")]
impl<T: ?Sized> fmt::Pointer for Unique<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
fmt::Pointer::fmt(&self.as_ptr(), f)
}
}
#[unstable(feature = "ptr_internals", issue = "none")]
impl<T: ?Sized> From<&mut T> for Unique<T> {
/// 将 `&mut T` 转换为 `Unique<T>`。
///
/// 这种转换是可靠的,因为引用不能为空。
#[inline]
fn from(reference: &mut T) -> Self {
Self::from(NonNull::from(reference))
}
}
#[unstable(feature = "ptr_internals", issue = "none")]
impl<T: ?Sized> From<NonNull<T>> for Unique<T> {
/// 将 `NonNull<T>` 转换为 `Unique<T>`。
///
/// 这种转换是可靠的,因为 `NonNull` 不能为空。
#[inline]
fn from(pointer: NonNull<T>) -> Self {
Unique { pointer, _marker: PhantomData }
}
}