Make pointer::with_metadata_of const (+simplify implementation)
This commit is contained in:
parent
44fcfb0a96
commit
6c54745784
2 changed files with 6 additions and 20 deletions
|
|
@ -79,19 +79,14 @@ impl<T: ?Sized> *const T {
|
|||
/// }
|
||||
/// ```
|
||||
#[unstable(feature = "set_ptr_value", issue = "75091")]
|
||||
#[rustc_const_unstable(feature = "set_ptr_value", issue = "75091")]
|
||||
#[must_use = "returns a new pointer rather than modifying its argument"]
|
||||
#[inline]
|
||||
pub fn with_metadata_of<U>(self, mut val: *const U) -> *const U
|
||||
pub const fn with_metadata_of<U>(self, meta: *const U) -> *const U
|
||||
where
|
||||
U: ?Sized,
|
||||
{
|
||||
let target = &mut val as *mut *const U as *mut *const u8;
|
||||
// SAFETY: In case of a thin pointer, this operations is identical
|
||||
// to a simple assignment. In case of a fat pointer, with the current
|
||||
// fat pointer layout implementation, the first field of such a
|
||||
// pointer is always the data pointer, which is likewise assigned.
|
||||
unsafe { *target = self as *const u8 };
|
||||
val
|
||||
from_raw_parts::<U>(self as *const (), metadata(meta))
|
||||
}
|
||||
|
||||
/// Changes constness without changing the type.
|
||||
|
|
|
|||
|
|
@ -78,23 +78,14 @@ impl<T: ?Sized> *mut T {
|
|||
/// }
|
||||
/// ```
|
||||
#[unstable(feature = "set_ptr_value", issue = "75091")]
|
||||
#[rustc_const_unstable(feature = "set_ptr_value", issue = "75091")]
|
||||
#[must_use = "returns a new pointer rather than modifying its argument"]
|
||||
#[inline]
|
||||
pub fn with_metadata_of<U>(self, val: *const U) -> *mut U
|
||||
pub const fn with_metadata_of<U>(self, meta: *const U) -> *mut U
|
||||
where
|
||||
U: ?Sized,
|
||||
{
|
||||
// Prepare in the type system that we will replace the pointer value with a mutable
|
||||
// pointer, taking the mutable provenance from the `self` pointer.
|
||||
let mut val = val as *mut U;
|
||||
// Pointer to the pointer value within the value.
|
||||
let target = &mut val as *mut *mut U as *mut *mut u8;
|
||||
// SAFETY: In case of a thin pointer, this operations is identical
|
||||
// to a simple assignment. In case of a fat pointer, with the current
|
||||
// fat pointer layout implementation, the first field of such a
|
||||
// pointer is always the data pointer, which is likewise assigned.
|
||||
unsafe { *target = self as *mut u8 };
|
||||
val
|
||||
from_raw_parts_mut::<U>(self as *mut (), metadata(meta))
|
||||
}
|
||||
|
||||
/// Changes constness without changing the type.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue