mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 10:13:54 +00:00
promise that ptr::copy and ptr::swap are doing untyped copies
This commit is contained in:
parent
b96d1e45f1
commit
cb7cd97641
@ -2043,6 +2043,9 @@ pub(crate) fn is_nonoverlapping<T>(src: *const T, dst: *const T, count: usize) -
|
||||
/// `copy_nonoverlapping` is semantically equivalent to C's [`memcpy`], but
|
||||
/// with the argument order swapped.
|
||||
///
|
||||
/// The copy is "untyped" in the sense that data may be uninitialized or otherwise violate the
|
||||
/// requirements of `T`. The initialization state is preserved exactly.
|
||||
///
|
||||
/// [`memcpy`]: https://en.cppreference.com/w/c/string/byte/memcpy
|
||||
///
|
||||
/// # Safety
|
||||
@ -2148,6 +2151,9 @@ pub const unsafe fn copy_nonoverlapping<T>(src: *const T, dst: *mut T, count: us
|
||||
/// order swapped. Copying takes place as if the bytes were copied from `src`
|
||||
/// to a temporary array and then copied from the array to `dst`.
|
||||
///
|
||||
/// The copy is "untyped" in the sense that data may be uninitialized or otherwise violate the
|
||||
/// requirements of `T`. The initialization state is preserved exactly.
|
||||
///
|
||||
/// [`memmove`]: https://en.cppreference.com/w/c/string/byte/memmove
|
||||
///
|
||||
/// # Safety
|
||||
|
@ -774,7 +774,7 @@ pub const fn slice_from_raw_parts_mut<T>(data: *mut T, len: usize) -> *mut [T] {
|
||||
/// Swaps the values at two mutable locations of the same type, without
|
||||
/// deinitializing either.
|
||||
///
|
||||
/// But for the following two exceptions, this function is semantically
|
||||
/// But for the following exceptions, this function is semantically
|
||||
/// equivalent to [`mem::swap`]:
|
||||
///
|
||||
/// * It operates on raw pointers instead of references. When references are
|
||||
@ -784,6 +784,9 @@ pub const fn slice_from_raw_parts_mut<T>(data: *mut T, len: usize) -> *mut [T] {
|
||||
/// overlapping region of memory from `x` will be used. This is demonstrated
|
||||
/// in the second example below.
|
||||
///
|
||||
/// * The operation is "untyped" in the sense that data may be uninitialized or otherwise violate
|
||||
/// the requirements of `T`. The initialization state is preserved exactly.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// Behavior is undefined if any of the following conditions are violated:
|
||||
@ -860,6 +863,9 @@ pub const unsafe fn swap<T>(x: *mut T, y: *mut T) {
|
||||
/// Swaps `count * size_of::<T>()` bytes between the two regions of memory
|
||||
/// beginning at `x` and `y`. The two regions must *not* overlap.
|
||||
///
|
||||
/// The operation is "untyped" in the sense that data may be uninitialized or otherwise violate the
|
||||
/// requirements of `T`. The initialization state is preserved exactly.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// Behavior is undefined if any of the following conditions are violated:
|
||||
@ -965,7 +971,7 @@ const unsafe fn swap_nonoverlapping_simple_untyped<T>(x: *mut T, y: *mut T, coun
|
||||
// SAFETY: By precondition, `i` is in-bounds because it's below `n`
|
||||
// and it's distinct from `x` since the ranges are non-overlapping
|
||||
let y = unsafe { &mut *y.add(i) };
|
||||
mem::swap_simple(x, y);
|
||||
mem::swap_simple::<MaybeUninit<T>>(x, y);
|
||||
|
||||
i += 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user