]> git.lizzy.rs Git - rust.git/blob - library/core/src/ptr/mut_ptr.rs
stabilize ptr_offset_from
[rust.git] / library / core / src / ptr / mut_ptr.rs
1 use super::*;
2 use crate::cmp::Ordering::{self, Equal, Greater, Less};
3 use crate::intrinsics;
4 use crate::slice::{self, SliceIndex};
5
6 #[lang = "mut_ptr"]
7 impl<T: ?Sized> *mut T {
8     /// Returns `true` if the pointer is null.
9     ///
10     /// Note that unsized types have many possible null pointers, as only the
11     /// raw data pointer is considered, not their length, vtable, etc.
12     /// Therefore, two pointers that are null may still not compare equal to
13     /// each other.
14     ///
15     /// ## Behavior during const evaluation
16     ///
17     /// When this function is used during const evaluation, it may return `false` for pointers
18     /// that turn out to be null at runtime. Specifically, when a pointer to some memory
19     /// is offset beyond its bounds in such a way that the resulting pointer is null,
20     /// the function will still return `false`. There is no way for CTFE to know
21     /// the absolute position of that memory, so we cannot tell if the pointer is
22     /// null or not.
23     ///
24     /// # Examples
25     ///
26     /// Basic usage:
27     ///
28     /// ```
29     /// let mut s = [1, 2, 3];
30     /// let ptr: *mut u32 = s.as_mut_ptr();
31     /// assert!(!ptr.is_null());
32     /// ```
33     #[stable(feature = "rust1", since = "1.0.0")]
34     #[rustc_const_unstable(feature = "const_ptr_is_null", issue = "74939")]
35     #[inline]
36     pub const fn is_null(self) -> bool {
37         // Compare via a cast to a thin pointer, so fat pointers are only
38         // considering their "data" part for null-ness.
39         (self as *mut u8).guaranteed_eq(null_mut())
40     }
41
42     /// Casts to a pointer of another type.
43     #[stable(feature = "ptr_cast", since = "1.38.0")]
44     #[rustc_const_stable(feature = "const_ptr_cast", since = "1.38.0")]
45     #[inline]
46     pub const fn cast<U>(self) -> *mut U {
47         self as _
48     }
49
50     /// Returns `None` if the pointer is null, or else returns a shared reference to
51     /// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_ref`]
52     /// must be used instead.
53     ///
54     /// For the mutable counterpart see [`as_mut`].
55     ///
56     /// [`as_uninit_ref`]: #method.as_uninit_ref-1
57     /// [`as_mut`]: #method.as_mut
58     ///
59     /// # Safety
60     ///
61     /// When calling this method, you have to ensure that *either* the pointer is NULL *or*
62     /// all of the following is true:
63     ///
64     /// * The pointer must be properly aligned.
65     ///
66     /// * It must be "dereferencable" in the sense defined in [the module documentation].
67     ///
68     /// * The pointer must point to an initialized instance of `T`.
69     ///
70     /// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
71     ///   arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
72     ///   In particular, for the duration of this lifetime, the memory the pointer points to must
73     ///   not get mutated (except inside `UnsafeCell`).
74     ///
75     /// This applies even if the result of this method is unused!
76     /// (The part about being initialized is not yet fully decided, but until
77     /// it is, the only safe approach is to ensure that they are indeed initialized.)
78     ///
79     /// [the module documentation]: crate::ptr#safety
80     ///
81     /// # Examples
82     ///
83     /// Basic usage:
84     ///
85     /// ```
86     /// let ptr: *mut u8 = &mut 10u8 as *mut u8;
87     ///
88     /// unsafe {
89     ///     if let Some(val_back) = ptr.as_ref() {
90     ///         println!("We got back the value: {}!", val_back);
91     ///     }
92     /// }
93     /// ```
94     ///
95     /// # Null-unchecked version
96     ///
97     /// If you are sure the pointer can never be null and are looking for some kind of
98     /// `as_ref_unchecked` that returns the `&T` instead of `Option<&T>`, know that you can
99     /// dereference the pointer directly.
100     ///
101     /// ```
102     /// let ptr: *mut u8 = &mut 10u8 as *mut u8;
103     ///
104     /// unsafe {
105     ///     let val_back = &*ptr;
106     ///     println!("We got back the value: {}!", val_back);
107     /// }
108     /// ```
109     #[stable(feature = "ptr_as_ref", since = "1.9.0")]
110     #[inline]
111     pub unsafe fn as_ref<'a>(self) -> Option<&'a T> {
112         // SAFETY: the caller must guarantee that `self` is valid for a
113         // reference if it isn't null.
114         if self.is_null() { None } else { unsafe { Some(&*self) } }
115     }
116
117     /// Returns `None` if the pointer is null, or else returns a shared reference to
118     /// the value wrapped in `Some`. In contrast to [`as_ref`], this does not require
119     /// that the value has to be initialized.
120     ///
121     /// For the mutable counterpart see [`as_uninit_mut`].
122     ///
123     /// [`as_ref`]: #method.as_ref-1
124     /// [`as_uninit_mut`]: #method.as_uninit_mut
125     ///
126     /// # Safety
127     ///
128     /// When calling this method, you have to ensure that *either* the pointer is NULL *or*
129     /// all of the following is true:
130     ///
131     /// * The pointer must be properly aligned.
132     ///
133     /// * It must be "dereferencable" in the sense defined in [the module documentation].
134     ///
135     /// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
136     ///   arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
137     ///   In particular, for the duration of this lifetime, the memory the pointer points to must
138     ///   not get mutated (except inside `UnsafeCell`).
139     ///
140     /// This applies even if the result of this method is unused!
141     ///
142     /// [the module documentation]: crate::ptr#safety
143     ///
144     /// # Examples
145     ///
146     /// Basic usage:
147     ///
148     /// ```
149     /// #![feature(ptr_as_uninit)]
150     ///
151     /// let ptr: *mut u8 = &mut 10u8 as *mut u8;
152     ///
153     /// unsafe {
154     ///     if let Some(val_back) = ptr.as_uninit_ref() {
155     ///         println!("We got back the value: {}!", val_back.assume_init());
156     ///     }
157     /// }
158     /// ```
159     #[inline]
160     #[unstable(feature = "ptr_as_uninit", issue = "75402")]
161     pub unsafe fn as_uninit_ref<'a>(self) -> Option<&'a MaybeUninit<T>>
162     where
163         T: Sized,
164     {
165         // SAFETY: the caller must guarantee that `self` meets all the
166         // requirements for a reference.
167         if self.is_null() { None } else { Some(unsafe { &*(self as *const MaybeUninit<T>) }) }
168     }
169
170     /// Calculates the offset from a pointer.
171     ///
172     /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
173     /// offset of `3 * size_of::<T>()` bytes.
174     ///
175     /// # Safety
176     ///
177     /// If any of the following conditions are violated, the result is Undefined
178     /// Behavior:
179     ///
180     /// * Both the starting and resulting pointer must be either in bounds or one
181     ///   byte past the end of the same allocated object. Note that in Rust,
182     ///   every (stack-allocated) variable is considered a separate allocated object.
183     ///
184     /// * The computed offset, **in bytes**, cannot overflow an `isize`.
185     ///
186     /// * The offset being in bounds cannot rely on "wrapping around" the address
187     ///   space. That is, the infinite-precision sum, **in bytes** must fit in a usize.
188     ///
189     /// The compiler and standard library generally tries to ensure allocations
190     /// never reach a size where an offset is a concern. For instance, `Vec`
191     /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so
192     /// `vec.as_ptr().add(vec.len())` is always safe.
193     ///
194     /// Most platforms fundamentally can't even construct such an allocation.
195     /// For instance, no known 64-bit platform can ever serve a request
196     /// for 2<sup>63</sup> bytes due to page-table limitations or splitting the address space.
197     /// However, some 32-bit and 16-bit platforms may successfully serve a request for
198     /// more than `isize::MAX` bytes with things like Physical Address
199     /// Extension. As such, memory acquired directly from allocators or memory
200     /// mapped files *may* be too large to handle with this function.
201     ///
202     /// Consider using [`wrapping_offset`] instead if these constraints are
203     /// difficult to satisfy. The only advantage of this method is that it
204     /// enables more aggressive compiler optimizations.
205     ///
206     /// [`wrapping_offset`]: #method.wrapping_offset
207     ///
208     /// # Examples
209     ///
210     /// Basic usage:
211     ///
212     /// ```
213     /// let mut s = [1, 2, 3];
214     /// let ptr: *mut u32 = s.as_mut_ptr();
215     ///
216     /// unsafe {
217     ///     println!("{}", *ptr.offset(1));
218     ///     println!("{}", *ptr.offset(2));
219     /// }
220     /// ```
221     #[stable(feature = "rust1", since = "1.0.0")]
222     #[must_use = "returns a new pointer rather than modifying its argument"]
223     #[rustc_const_unstable(feature = "const_ptr_offset", issue = "71499")]
224     #[inline]
225     pub const unsafe fn offset(self, count: isize) -> *mut T
226     where
227         T: Sized,
228     {
229         // SAFETY: the caller must uphold the safety contract for `offset`.
230         // The obtained pointer is valid for writes since the caller must
231         // guarantee that it points to the same allocated object as `self`.
232         unsafe { intrinsics::offset(self, count) as *mut T }
233     }
234
235     /// Calculates the offset from a pointer using wrapping arithmetic.
236     /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
237     /// offset of `3 * size_of::<T>()` bytes.
238     ///
239     /// # Safety
240     ///
241     /// The resulting pointer does not need to be in bounds, but it is
242     /// potentially hazardous to dereference (which requires `unsafe`).
243     ///
244     /// In particular, the resulting pointer remains attached to the same allocated
245     /// object that `self` points to. It may *not* be used to access a
246     /// different allocated object. Note that in Rust,
247     /// every (stack-allocated) variable is considered a separate allocated object.
248     ///
249     /// In other words, `x.wrapping_offset(y.wrapping_offset_from(x))` is
250     /// *not* the same as `y`, and dereferencing it is undefined behavior
251     /// unless `x` and `y` point into the same allocated object.
252     ///
253     /// Compared to [`offset`], this method basically delays the requirement of staying
254     /// within the same allocated object: [`offset`] is immediate Undefined Behavior when
255     /// crossing object boundaries; `wrapping_offset` produces a pointer but still leads
256     /// to Undefined Behavior if that pointer is dereferenced. [`offset`] can be optimized
257     /// better and is thus preferable in performance-sensitive code.
258     ///
259     /// If you need to cross object boundaries, cast the pointer to an integer and
260     /// do the arithmetic there.
261     ///
262     /// [`offset`]: #method.offset
263     ///
264     /// # Examples
265     ///
266     /// Basic usage:
267     ///
268     /// ```
269     /// // Iterate using a raw pointer in increments of two elements
270     /// let mut data = [1u8, 2, 3, 4, 5];
271     /// let mut ptr: *mut u8 = data.as_mut_ptr();
272     /// let step = 2;
273     /// let end_rounded_up = ptr.wrapping_offset(6);
274     ///
275     /// while ptr != end_rounded_up {
276     ///     unsafe {
277     ///         *ptr = 0;
278     ///     }
279     ///     ptr = ptr.wrapping_offset(step);
280     /// }
281     /// assert_eq!(&data, &[0, 2, 0, 4, 0]);
282     /// ```
283     #[stable(feature = "ptr_wrapping_offset", since = "1.16.0")]
284     #[must_use = "returns a new pointer rather than modifying its argument"]
285     #[rustc_const_unstable(feature = "const_ptr_offset", issue = "71499")]
286     #[inline]
287     pub const fn wrapping_offset(self, count: isize) -> *mut T
288     where
289         T: Sized,
290     {
291         // SAFETY: the `arith_offset` intrinsic has no prerequisites to be called.
292         unsafe { intrinsics::arith_offset(self, count) as *mut T }
293     }
294
295     /// Returns `None` if the pointer is null, or else returns a unique reference to
296     /// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_mut`]
297     /// must be used instead.
298     ///
299     /// For the shared counterpart see [`as_ref`].
300     ///
301     /// [`as_uninit_mut`]: #method.as_uninit_mut
302     /// [`as_ref`]: #method.as_ref-1
303     ///
304     /// # Safety
305     ///
306     /// When calling this method, you have to ensure that *either* the pointer is NULL *or*
307     /// all of the following is true:
308     ///
309     /// * The pointer must be properly aligned.
310     ///
311     /// * It must be "dereferencable" in the sense defined in [the module documentation].
312     ///
313     /// * The pointer must point to an initialized instance of `T`.
314     ///
315     /// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
316     ///   arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
317     ///   In particular, for the duration of this lifetime, the memory the pointer points to must
318     ///   not get accessed (read or written) through any other pointer.
319     ///
320     /// This applies even if the result of this method is unused!
321     /// (The part about being initialized is not yet fully decided, but until
322     /// it is, the only safe approach is to ensure that they are indeed initialized.)
323     ///
324     /// [the module documentation]: crate::ptr#safety
325     ///
326     /// # Examples
327     ///
328     /// Basic usage:
329     ///
330     /// ```
331     /// let mut s = [1, 2, 3];
332     /// let ptr: *mut u32 = s.as_mut_ptr();
333     /// let first_value = unsafe { ptr.as_mut().unwrap() };
334     /// *first_value = 4;
335     /// # assert_eq!(s, [4, 2, 3]);
336     /// println!("{:?}", s); // It'll print: "[4, 2, 3]".
337     /// ```
338     ///
339     /// # Null-unchecked version
340     ///
341     /// If you are sure the pointer can never be null and are looking for some kind of
342     /// `as_mut_unchecked` that returns the `&mut T` instead of `Option<&mut T>`, know that
343     /// you can dereference the pointer directly.
344     ///
345     /// ```
346     /// let mut s = [1, 2, 3];
347     /// let ptr: *mut u32 = s.as_mut_ptr();
348     /// let first_value = unsafe { &mut *ptr };
349     /// *first_value = 4;
350     /// # assert_eq!(s, [4, 2, 3]);
351     /// println!("{:?}", s); // It'll print: "[4, 2, 3]".
352     /// ```
353     #[stable(feature = "ptr_as_ref", since = "1.9.0")]
354     #[inline]
355     pub unsafe fn as_mut<'a>(self) -> Option<&'a mut T> {
356         // SAFETY: the caller must guarantee that `self` is be valid for
357         // a mutable reference if it isn't null.
358         if self.is_null() { None } else { unsafe { Some(&mut *self) } }
359     }
360
361     /// Returns `None` if the pointer is null, or else returns a unique reference to
362     /// the value wrapped in `Some`. In contrast to [`as_mut`], this does not require
363     /// that the value has to be initialized.
364     ///
365     /// For the shared counterpart see [`as_uninit_ref`].
366     ///
367     /// [`as_mut`]: #method.as_mut
368     /// [`as_uninit_ref`]: #method.as_uninit_ref-1
369     ///
370     /// # Safety
371     ///
372     /// When calling this method, you have to ensure that *either* the pointer is NULL *or*
373     /// all of the following is true:
374     ///
375     /// * The pointer must be properly aligned.
376     ///
377     /// * It must be "dereferencable" in the sense defined in [the module documentation].
378     ///
379     /// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
380     ///   arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
381     ///   In particular, for the duration of this lifetime, the memory the pointer points to must
382     ///   not get accessed (read or written) through any other pointer.
383     ///
384     /// This applies even if the result of this method is unused!
385     ///
386     /// [the module documentation]: crate::ptr#safety
387     #[inline]
388     #[unstable(feature = "ptr_as_uninit", issue = "75402")]
389     pub unsafe fn as_uninit_mut<'a>(self) -> Option<&'a mut MaybeUninit<T>>
390     where
391         T: Sized,
392     {
393         // SAFETY: the caller must guarantee that `self` meets all the
394         // requirements for a reference.
395         if self.is_null() { None } else { Some(unsafe { &mut *(self as *mut MaybeUninit<T>) }) }
396     }
397
398     /// Returns whether two pointers are guaranteed to be equal.
399     ///
400     /// At runtime this function behaves like `self == other`.
401     /// However, in some contexts (e.g., compile-time evaluation),
402     /// it is not always possible to determine equality of two pointers, so this function may
403     /// spuriously return `false` for pointers that later actually turn out to be equal.
404     /// But when it returns `true`, the pointers are guaranteed to be equal.
405     ///
406     /// This function is the mirror of [`guaranteed_ne`], but not its inverse. There are pointer
407     /// comparisons for which both functions return `false`.
408     ///
409     /// [`guaranteed_ne`]: #method.guaranteed_ne
410     ///
411     /// The return value may change depending on the compiler version and unsafe code may not
412     /// rely on the result of this function for soundness. It is suggested to only use this function
413     /// for performance optimizations where spurious `false` return values by this function do not
414     /// affect the outcome, but just the performance.
415     /// The consequences of using this method to make runtime and compile-time code behave
416     /// differently have not been explored. This method should not be used to introduce such
417     /// differences, and it should also not be stabilized before we have a better understanding
418     /// of this issue.
419     #[unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
420     #[rustc_const_unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
421     #[inline]
422     pub const fn guaranteed_eq(self, other: *mut T) -> bool
423     where
424         T: Sized,
425     {
426         intrinsics::ptr_guaranteed_eq(self as *const _, other as *const _)
427     }
428
429     /// Returns whether two pointers are guaranteed to be unequal.
430     ///
431     /// At runtime this function behaves like `self != other`.
432     /// However, in some contexts (e.g., compile-time evaluation),
433     /// it is not always possible to determine the inequality of two pointers, so this function may
434     /// spuriously return `false` for pointers that later actually turn out to be unequal.
435     /// But when it returns `true`, the pointers are guaranteed to be unequal.
436     ///
437     /// This function is the mirror of [`guaranteed_eq`], but not its inverse. There are pointer
438     /// comparisons for which both functions return `false`.
439     ///
440     /// [`guaranteed_eq`]: #method.guaranteed_eq
441     ///
442     /// The return value may change depending on the compiler version and unsafe code may not
443     /// rely on the result of this function for soundness. It is suggested to only use this function
444     /// for performance optimizations where spurious `false` return values by this function do not
445     /// affect the outcome, but just the performance.
446     /// The consequences of using this method to make runtime and compile-time code behave
447     /// differently have not been explored. This method should not be used to introduce such
448     /// differences, and it should also not be stabilized before we have a better understanding
449     /// of this issue.
450     #[unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
451     #[rustc_const_unstable(feature = "const_raw_ptr_comparison", issue = "53020")]
452     #[inline]
453     pub const unsafe fn guaranteed_ne(self, other: *mut T) -> bool
454     where
455         T: Sized,
456     {
457         intrinsics::ptr_guaranteed_ne(self as *const _, other as *const _)
458     }
459
460     /// Calculates the distance between two pointers. The returned value is in
461     /// units of T: the distance in bytes is divided by `mem::size_of::<T>()`.
462     ///
463     /// This function is the inverse of [`offset`].
464     ///
465     /// [`offset`]: #method.offset-1
466     /// [`wrapping_offset_from`]: #method.wrapping_offset_from-1
467     ///
468     /// # Safety
469     ///
470     /// If any of the following conditions are violated, the result is Undefined
471     /// Behavior:
472     ///
473     /// * Both the starting and other pointer must be either in bounds or one
474     ///   byte past the end of the same allocated object. Note that in Rust,
475     ///   every (stack-allocated) variable is considered a separate allocated object.
476     ///
477     /// * Both pointers must be *derived from* a pointer to the same object.
478     ///   (See below for an example.)
479     ///
480     /// * The distance between the pointers, **in bytes**, cannot overflow an `isize`.
481     ///
482     /// * The distance between the pointers, in bytes, must be an exact multiple
483     ///   of the size of `T`.
484     ///
485     /// * The distance being in bounds cannot rely on "wrapping around" the address space.
486     ///
487     /// The compiler and standard library generally try to ensure allocations
488     /// never reach a size where an offset is a concern. For instance, `Vec`
489     /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so
490     /// `ptr_into_vec.offset_from(vec.as_ptr())` is always safe.
491     ///
492     /// Most platforms fundamentally can't even construct such an allocation.
493     /// For instance, no known 64-bit platform can ever serve a request
494     /// for 2<sup>63</sup> bytes due to page-table limitations or splitting the address space.
495     /// However, some 32-bit and 16-bit platforms may successfully serve a request for
496     /// more than `isize::MAX` bytes with things like Physical Address
497     /// Extension. As such, memory acquired directly from allocators or memory
498     /// mapped files *may* be too large to handle with this function.
499     ///
500     /// Consider using [`wrapping_offset_from`] instead if these constraints are
501     /// difficult to satisfy. The only advantage of this method is that it
502     /// enables more aggressive compiler optimizations.
503     ///
504     /// # Panics
505     ///
506     /// This function panics if `T` is a Zero-Sized Type ("ZST").
507     ///
508     /// # Examples
509     ///
510     /// Basic usage:
511     ///
512     /// ```
513     /// #![feature(ptr_offset_from)]
514     ///
515     /// let mut a = [0; 5];
516     /// let ptr1: *mut i32 = &mut a[1];
517     /// let ptr2: *mut i32 = &mut a[3];
518     /// unsafe {
519     ///     assert_eq!(ptr2.offset_from(ptr1), 2);
520     ///     assert_eq!(ptr1.offset_from(ptr2), -2);
521     ///     assert_eq!(ptr1.offset(2), ptr2);
522     ///     assert_eq!(ptr2.offset(-2), ptr1);
523     /// }
524     /// ```
525     ///
526     /// *Incorrect* usage:
527     ///
528     /// ```rust,no_run
529     /// #![feature(ptr_offset_from)]
530     ///
531     /// let ptr1 = Box::into_raw(Box::new(0u8));
532     /// let ptr2 = Box::into_raw(Box::new(1u8));
533     /// let diff = (ptr2 as isize).wrapping_sub(ptr1 as isize);
534     /// // Make ptr2_other an "alias" of ptr2, but derived from ptr1.
535     /// let ptr2_other = (ptr1 as *mut u8).wrapping_offset(diff);
536     /// assert_eq!(ptr2 as usize, ptr2_other as usize);
537     /// // Since ptr2_other and ptr2 are derived from pointers to different objects,
538     /// // computing their offset is undefined behavior, even though
539     /// // they point to the same address!
540     /// unsafe {
541     ///     let zero = ptr2_other.offset_from(ptr2); // Undefined Behavior
542     /// }
543     /// ```
544     #[stable(feature = "ptr_offset_from", since = "1.46.0")]
545     #[rustc_const_unstable(feature = "const_ptr_offset_from", issue = "41079")]
546     #[inline]
547     pub const unsafe fn offset_from(self, origin: *const T) -> isize
548     where
549         T: Sized,
550     {
551         // SAFETY: the caller must uphold the safety contract for `offset_from`.
552         unsafe { (self as *const T).offset_from(origin) }
553     }
554
555     /// Calculates the offset from a pointer (convenience for `.offset(count as isize)`).
556     ///
557     /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
558     /// offset of `3 * size_of::<T>()` bytes.
559     ///
560     /// # Safety
561     ///
562     /// If any of the following conditions are violated, the result is Undefined
563     /// Behavior:
564     ///
565     /// * Both the starting and resulting pointer must be either in bounds or one
566     ///   byte past the end of the same allocated object. Note that in Rust,
567     ///   every (stack-allocated) variable is considered a separate allocated object.
568     ///
569     /// * The computed offset, **in bytes**, cannot overflow an `isize`.
570     ///
571     /// * The offset being in bounds cannot rely on "wrapping around" the address
572     ///   space. That is, the infinite-precision sum must fit in a `usize`.
573     ///
574     /// The compiler and standard library generally tries to ensure allocations
575     /// never reach a size where an offset is a concern. For instance, `Vec`
576     /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so
577     /// `vec.as_ptr().add(vec.len())` is always safe.
578     ///
579     /// Most platforms fundamentally can't even construct such an allocation.
580     /// For instance, no known 64-bit platform can ever serve a request
581     /// for 2<sup>63</sup> bytes due to page-table limitations or splitting the address space.
582     /// However, some 32-bit and 16-bit platforms may successfully serve a request for
583     /// more than `isize::MAX` bytes with things like Physical Address
584     /// Extension. As such, memory acquired directly from allocators or memory
585     /// mapped files *may* be too large to handle with this function.
586     ///
587     /// Consider using [`wrapping_add`] instead if these constraints are
588     /// difficult to satisfy. The only advantage of this method is that it
589     /// enables more aggressive compiler optimizations.
590     ///
591     /// [`wrapping_add`]: #method.wrapping_add
592     ///
593     /// # Examples
594     ///
595     /// Basic usage:
596     ///
597     /// ```
598     /// let s: &str = "123";
599     /// let ptr: *const u8 = s.as_ptr();
600     ///
601     /// unsafe {
602     ///     println!("{}", *ptr.add(1) as char);
603     ///     println!("{}", *ptr.add(2) as char);
604     /// }
605     /// ```
606     #[stable(feature = "pointer_methods", since = "1.26.0")]
607     #[must_use = "returns a new pointer rather than modifying its argument"]
608     #[rustc_const_unstable(feature = "const_ptr_offset", issue = "71499")]
609     #[inline]
610     pub const unsafe fn add(self, count: usize) -> Self
611     where
612         T: Sized,
613     {
614         // SAFETY: the caller must uphold the safety contract for `offset`.
615         unsafe { self.offset(count as isize) }
616     }
617
618     /// Calculates the offset from a pointer (convenience for
619     /// `.offset((count as isize).wrapping_neg())`).
620     ///
621     /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
622     /// offset of `3 * size_of::<T>()` bytes.
623     ///
624     /// # Safety
625     ///
626     /// If any of the following conditions are violated, the result is Undefined
627     /// Behavior:
628     ///
629     /// * Both the starting and resulting pointer must be either in bounds or one
630     ///   byte past the end of the same allocated object. Note that in Rust,
631     ///   every (stack-allocated) variable is considered a separate allocated object.
632     ///
633     /// * The computed offset cannot exceed `isize::MAX` **bytes**.
634     ///
635     /// * The offset being in bounds cannot rely on "wrapping around" the address
636     ///   space. That is, the infinite-precision sum must fit in a usize.
637     ///
638     /// The compiler and standard library generally tries to ensure allocations
639     /// never reach a size where an offset is a concern. For instance, `Vec`
640     /// and `Box` ensure they never allocate more than `isize::MAX` bytes, so
641     /// `vec.as_ptr().add(vec.len()).sub(vec.len())` is always safe.
642     ///
643     /// Most platforms fundamentally can't even construct such an allocation.
644     /// For instance, no known 64-bit platform can ever serve a request
645     /// for 2<sup>63</sup> bytes due to page-table limitations or splitting the address space.
646     /// However, some 32-bit and 16-bit platforms may successfully serve a request for
647     /// more than `isize::MAX` bytes with things like Physical Address
648     /// Extension. As such, memory acquired directly from allocators or memory
649     /// mapped files *may* be too large to handle with this function.
650     ///
651     /// Consider using [`wrapping_sub`] instead if these constraints are
652     /// difficult to satisfy. The only advantage of this method is that it
653     /// enables more aggressive compiler optimizations.
654     ///
655     /// [`wrapping_sub`]: #method.wrapping_sub
656     ///
657     /// # Examples
658     ///
659     /// Basic usage:
660     ///
661     /// ```
662     /// let s: &str = "123";
663     ///
664     /// unsafe {
665     ///     let end: *const u8 = s.as_ptr().add(3);
666     ///     println!("{}", *end.sub(1) as char);
667     ///     println!("{}", *end.sub(2) as char);
668     /// }
669     /// ```
670     #[stable(feature = "pointer_methods", since = "1.26.0")]
671     #[must_use = "returns a new pointer rather than modifying its argument"]
672     #[rustc_const_unstable(feature = "const_ptr_offset", issue = "71499")]
673     #[inline]
674     pub const unsafe fn sub(self, count: usize) -> Self
675     where
676         T: Sized,
677     {
678         // SAFETY: the caller must uphold the safety contract for `offset`.
679         unsafe { self.offset((count as isize).wrapping_neg()) }
680     }
681
682     /// Calculates the offset from a pointer using wrapping arithmetic.
683     /// (convenience for `.wrapping_offset(count as isize)`)
684     ///
685     /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
686     /// offset of `3 * size_of::<T>()` bytes.
687     ///
688     /// # Safety
689     ///
690     /// The resulting pointer does not need to be in bounds, but it is
691     /// potentially hazardous to dereference (which requires `unsafe`).
692     ///
693     /// In particular, the resulting pointer remains attached to the same allocated
694     /// object that `self` points to. It may *not* be used to access a
695     /// different allocated object. Note that in Rust,
696     /// every (stack-allocated) variable is considered a separate allocated object.
697     ///
698     /// Compared to [`add`], this method basically delays the requirement of staying
699     /// within the same allocated object: [`add`] is immediate Undefined Behavior when
700     /// crossing object boundaries; `wrapping_add` produces a pointer but still leads
701     /// to Undefined Behavior if that pointer is dereferenced. [`add`] can be optimized
702     /// better and is thus preferable in performance-sensitive code.
703     ///
704     /// If you need to cross object boundaries, cast the pointer to an integer and
705     /// do the arithmetic there.
706     ///
707     /// [`add`]: #method.add
708     ///
709     /// # Examples
710     ///
711     /// Basic usage:
712     ///
713     /// ```
714     /// // Iterate using a raw pointer in increments of two elements
715     /// let data = [1u8, 2, 3, 4, 5];
716     /// let mut ptr: *const u8 = data.as_ptr();
717     /// let step = 2;
718     /// let end_rounded_up = ptr.wrapping_add(6);
719     ///
720     /// // This loop prints "1, 3, 5, "
721     /// while ptr != end_rounded_up {
722     ///     unsafe {
723     ///         print!("{}, ", *ptr);
724     ///     }
725     ///     ptr = ptr.wrapping_add(step);
726     /// }
727     /// ```
728     #[stable(feature = "pointer_methods", since = "1.26.0")]
729     #[must_use = "returns a new pointer rather than modifying its argument"]
730     #[rustc_const_unstable(feature = "const_ptr_offset", issue = "71499")]
731     #[inline]
732     pub const fn wrapping_add(self, count: usize) -> Self
733     where
734         T: Sized,
735     {
736         self.wrapping_offset(count as isize)
737     }
738
739     /// Calculates the offset from a pointer using wrapping arithmetic.
740     /// (convenience for `.wrapping_offset((count as isize).wrapping_sub())`)
741     ///
742     /// `count` is in units of T; e.g., a `count` of 3 represents a pointer
743     /// offset of `3 * size_of::<T>()` bytes.
744     ///
745     /// # Safety
746     ///
747     /// The resulting pointer does not need to be in bounds, but it is
748     /// potentially hazardous to dereference (which requires `unsafe`).
749     ///
750     /// In particular, the resulting pointer remains attached to the same allocated
751     /// object that `self` points to. It may *not* be used to access a
752     /// different allocated object. Note that in Rust,
753     /// every (stack-allocated) variable is considered a separate allocated object.
754     ///
755     /// Compared to [`sub`], this method basically delays the requirement of staying
756     /// within the same allocated object: [`sub`] is immediate Undefined Behavior when
757     /// crossing object boundaries; `wrapping_sub` produces a pointer but still leads
758     /// to Undefined Behavior if that pointer is dereferenced. [`sub`] can be optimized
759     /// better and is thus preferable in performance-sensitive code.
760     ///
761     /// If you need to cross object boundaries, cast the pointer to an integer and
762     /// do the arithmetic there.
763     ///
764     /// [`sub`]: #method.sub
765     ///
766     /// # Examples
767     ///
768     /// Basic usage:
769     ///
770     /// ```
771     /// // Iterate using a raw pointer in increments of two elements (backwards)
772     /// let data = [1u8, 2, 3, 4, 5];
773     /// let mut ptr: *const u8 = data.as_ptr();
774     /// let start_rounded_down = ptr.wrapping_sub(2);
775     /// ptr = ptr.wrapping_add(4);
776     /// let step = 2;
777     /// // This loop prints "5, 3, 1, "
778     /// while ptr != start_rounded_down {
779     ///     unsafe {
780     ///         print!("{}, ", *ptr);
781     ///     }
782     ///     ptr = ptr.wrapping_sub(step);
783     /// }
784     /// ```
785     #[stable(feature = "pointer_methods", since = "1.26.0")]
786     #[must_use = "returns a new pointer rather than modifying its argument"]
787     #[rustc_const_unstable(feature = "const_ptr_offset", issue = "71499")]
788     #[inline]
789     pub const fn wrapping_sub(self, count: usize) -> Self
790     where
791         T: Sized,
792     {
793         self.wrapping_offset((count as isize).wrapping_neg())
794     }
795
796     /// Sets the pointer value to `ptr`.
797     ///
798     /// In case `self` is a (fat) pointer to an unsized type, this operation
799     /// will only affect the pointer part, whereas for (thin) pointers to
800     /// sized types, this has the same effect as a simple assignment.
801     ///
802     /// The resulting pointer will have provenance of `val`, i.e., for a fat
803     /// pointer, this operation is semantically the same as creating a new
804     /// fat pointer with the data pointer value of `val` but the metadata of
805     /// `self`.
806     ///
807     /// # Examples
808     ///
809     /// This function is primarily useful for allowing byte-wise pointer
810     /// arithmetic on potentially fat pointers:
811     ///
812     /// ```
813     /// #![feature(set_ptr_value)]
814     /// # use core::fmt::Debug;
815     /// let mut arr: [i32; 3] = [1, 2, 3];
816     /// let mut ptr = &mut arr[0] as *mut dyn Debug;
817     /// let thin = ptr as *mut u8;
818     /// unsafe {
819     ///     ptr = ptr.set_ptr_value(thin.add(8));
820     ///     # assert_eq!(*(ptr as *mut i32), 3);
821     ///     println!("{:?}", &*ptr); // will print "3"
822     /// }
823     /// ```
824     #[unstable(feature = "set_ptr_value", issue = "75091")]
825     #[must_use = "returns a new pointer rather than modifying its argument"]
826     #[inline]
827     pub fn set_ptr_value(mut self, val: *mut u8) -> Self {
828         let thin = &mut self as *mut *mut T as *mut *mut u8;
829         // SAFETY: In case of a thin pointer, this operations is identical
830         // to a simple assignment. In case of a fat pointer, with the current
831         // fat pointer layout implementation, the first field of such a
832         // pointer is always the data pointer, which is likewise assigned.
833         unsafe { *thin = val };
834         self
835     }
836
837     /// Reads the value from `self` without moving it. This leaves the
838     /// memory in `self` unchanged.
839     ///
840     /// See [`ptr::read`] for safety concerns and examples.
841     ///
842     /// [`ptr::read`]: ./ptr/fn.read.html
843     #[stable(feature = "pointer_methods", since = "1.26.0")]
844     #[inline]
845     pub unsafe fn read(self) -> T
846     where
847         T: Sized,
848     {
849         // SAFETY: the caller must uphold the safety contract for ``.
850         unsafe { read(self) }
851     }
852
853     /// Performs a volatile read of the value from `self` without moving it. This
854     /// leaves the memory in `self` unchanged.
855     ///
856     /// Volatile operations are intended to act on I/O memory, and are guaranteed
857     /// to not be elided or reordered by the compiler across other volatile
858     /// operations.
859     ///
860     /// See [`ptr::read_volatile`] for safety concerns and examples.
861     ///
862     /// [`ptr::read_volatile`]: ./ptr/fn.read_volatile.html
863     #[stable(feature = "pointer_methods", since = "1.26.0")]
864     #[inline]
865     pub unsafe fn read_volatile(self) -> T
866     where
867         T: Sized,
868     {
869         // SAFETY: the caller must uphold the safety contract for `read_volatile`.
870         unsafe { read_volatile(self) }
871     }
872
873     /// Reads the value from `self` without moving it. This leaves the
874     /// memory in `self` unchanged.
875     ///
876     /// Unlike `read`, the pointer may be unaligned.
877     ///
878     /// See [`ptr::read_unaligned`] for safety concerns and examples.
879     ///
880     /// [`ptr::read_unaligned`]: ./ptr/fn.read_unaligned.html
881     #[stable(feature = "pointer_methods", since = "1.26.0")]
882     #[inline]
883     pub unsafe fn read_unaligned(self) -> T
884     where
885         T: Sized,
886     {
887         // SAFETY: the caller must uphold the safety contract for `read_unaligned`.
888         unsafe { read_unaligned(self) }
889     }
890
891     /// Copies `count * size_of<T>` bytes from `self` to `dest`. The source
892     /// and destination may overlap.
893     ///
894     /// NOTE: this has the *same* argument order as [`ptr::copy`].
895     ///
896     /// See [`ptr::copy`] for safety concerns and examples.
897     ///
898     /// [`ptr::copy`]: ./ptr/fn.copy.html
899     #[stable(feature = "pointer_methods", since = "1.26.0")]
900     #[inline]
901     pub unsafe fn copy_to(self, dest: *mut T, count: usize)
902     where
903         T: Sized,
904     {
905         // SAFETY: the caller must uphold the safety contract for `copy`.
906         unsafe { copy(self, dest, count) }
907     }
908
909     /// Copies `count * size_of<T>` bytes from `self` to `dest`. The source
910     /// and destination may *not* overlap.
911     ///
912     /// NOTE: this has the *same* argument order as [`ptr::copy_nonoverlapping`].
913     ///
914     /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples.
915     ///
916     /// [`ptr::copy_nonoverlapping`]: ./ptr/fn.copy_nonoverlapping.html
917     #[stable(feature = "pointer_methods", since = "1.26.0")]
918     #[inline]
919     pub unsafe fn copy_to_nonoverlapping(self, dest: *mut T, count: usize)
920     where
921         T: Sized,
922     {
923         // SAFETY: the caller must uphold the safety contract for `copy_nonoverlapping`.
924         unsafe { copy_nonoverlapping(self, dest, count) }
925     }
926
927     /// Copies `count * size_of<T>` bytes from `src` to `self`. The source
928     /// and destination may overlap.
929     ///
930     /// NOTE: this has the *opposite* argument order of [`ptr::copy`].
931     ///
932     /// See [`ptr::copy`] for safety concerns and examples.
933     ///
934     /// [`ptr::copy`]: ./ptr/fn.copy.html
935     #[stable(feature = "pointer_methods", since = "1.26.0")]
936     #[inline]
937     pub unsafe fn copy_from(self, src: *const T, count: usize)
938     where
939         T: Sized,
940     {
941         // SAFETY: the caller must uphold the safety contract for `copy`.
942         unsafe { copy(src, self, count) }
943     }
944
945     /// Copies `count * size_of<T>` bytes from `src` to `self`. The source
946     /// and destination may *not* overlap.
947     ///
948     /// NOTE: this has the *opposite* argument order of [`ptr::copy_nonoverlapping`].
949     ///
950     /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples.
951     ///
952     /// [`ptr::copy_nonoverlapping`]: ./ptr/fn.copy_nonoverlapping.html
953     #[stable(feature = "pointer_methods", since = "1.26.0")]
954     #[inline]
955     pub unsafe fn copy_from_nonoverlapping(self, src: *const T, count: usize)
956     where
957         T: Sized,
958     {
959         // SAFETY: the caller must uphold the safety contract for `copy_nonoverlapping`.
960         unsafe { copy_nonoverlapping(src, self, count) }
961     }
962
963     /// Executes the destructor (if any) of the pointed-to value.
964     ///
965     /// See [`ptr::drop_in_place`] for safety concerns and examples.
966     ///
967     /// [`ptr::drop_in_place`]: ./ptr/fn.drop_in_place.html
968     #[stable(feature = "pointer_methods", since = "1.26.0")]
969     #[inline]
970     pub unsafe fn drop_in_place(self) {
971         // SAFETY: the caller must uphold the safety contract for `drop_in_place`.
972         unsafe { drop_in_place(self) }
973     }
974
975     /// Overwrites a memory location with the given value without reading or
976     /// dropping the old value.
977     ///
978     /// See [`ptr::write`] for safety concerns and examples.
979     ///
980     /// [`ptr::write`]: ./ptr/fn.write.html
981     #[stable(feature = "pointer_methods", since = "1.26.0")]
982     #[inline]
983     pub unsafe fn write(self, val: T)
984     where
985         T: Sized,
986     {
987         // SAFETY: the caller must uphold the safety contract for `write`.
988         unsafe { write(self, val) }
989     }
990
991     /// Invokes memset on the specified pointer, setting `count * size_of::<T>()`
992     /// bytes of memory starting at `self` to `val`.
993     ///
994     /// See [`ptr::write_bytes`] for safety concerns and examples.
995     ///
996     /// [`ptr::write_bytes`]: ./ptr/fn.write_bytes.html
997     #[stable(feature = "pointer_methods", since = "1.26.0")]
998     #[inline]
999     pub unsafe fn write_bytes(self, val: u8, count: usize)
1000     where
1001         T: Sized,
1002     {
1003         // SAFETY: the caller must uphold the safety contract for `write_bytes`.
1004         unsafe { write_bytes(self, val, count) }
1005     }
1006
1007     /// Performs a volatile write of a memory location with the given value without
1008     /// reading or dropping the old value.
1009     ///
1010     /// Volatile operations are intended to act on I/O memory, and are guaranteed
1011     /// to not be elided or reordered by the compiler across other volatile
1012     /// operations.
1013     ///
1014     /// See [`ptr::write_volatile`] for safety concerns and examples.
1015     ///
1016     /// [`ptr::write_volatile`]: ./ptr/fn.write_volatile.html
1017     #[stable(feature = "pointer_methods", since = "1.26.0")]
1018     #[inline]
1019     pub unsafe fn write_volatile(self, val: T)
1020     where
1021         T: Sized,
1022     {
1023         // SAFETY: the caller must uphold the safety contract for `write_volatile`.
1024         unsafe { write_volatile(self, val) }
1025     }
1026
1027     /// Overwrites a memory location with the given value without reading or
1028     /// dropping the old value.
1029     ///
1030     /// Unlike `write`, the pointer may be unaligned.
1031     ///
1032     /// See [`ptr::write_unaligned`] for safety concerns and examples.
1033     ///
1034     /// [`ptr::write_unaligned`]: ./ptr/fn.write_unaligned.html
1035     #[stable(feature = "pointer_methods", since = "1.26.0")]
1036     #[inline]
1037     pub unsafe fn write_unaligned(self, val: T)
1038     where
1039         T: Sized,
1040     {
1041         // SAFETY: the caller must uphold the safety contract for `write_unaligned`.
1042         unsafe { write_unaligned(self, val) }
1043     }
1044
1045     /// Replaces the value at `self` with `src`, returning the old
1046     /// value, without dropping either.
1047     ///
1048     /// See [`ptr::replace`] for safety concerns and examples.
1049     ///
1050     /// [`ptr::replace`]: ./ptr/fn.replace.html
1051     #[stable(feature = "pointer_methods", since = "1.26.0")]
1052     #[inline]
1053     pub unsafe fn replace(self, src: T) -> T
1054     where
1055         T: Sized,
1056     {
1057         // SAFETY: the caller must uphold the safety contract for `replace`.
1058         unsafe { replace(self, src) }
1059     }
1060
1061     /// Swaps the values at two mutable locations of the same type, without
1062     /// deinitializing either. They may overlap, unlike `mem::swap` which is
1063     /// otherwise equivalent.
1064     ///
1065     /// See [`ptr::swap`] for safety concerns and examples.
1066     ///
1067     /// [`ptr::swap`]: ./ptr/fn.swap.html
1068     #[stable(feature = "pointer_methods", since = "1.26.0")]
1069     #[inline]
1070     pub unsafe fn swap(self, with: *mut T)
1071     where
1072         T: Sized,
1073     {
1074         // SAFETY: the caller must uphold the safety contract for `swap`.
1075         unsafe { swap(self, with) }
1076     }
1077
1078     /// Computes the offset that needs to be applied to the pointer in order to make it aligned to
1079     /// `align`.
1080     ///
1081     /// If it is not possible to align the pointer, the implementation returns
1082     /// `usize::MAX`. It is permissible for the implementation to *always*
1083     /// return `usize::MAX`. Only your algorithm's performance can depend
1084     /// on getting a usable offset here, not its correctness.
1085     ///
1086     /// The offset is expressed in number of `T` elements, and not bytes. The value returned can be
1087     /// used with the `wrapping_add` method.
1088     ///
1089     /// There are no guarantees whatsoever that offsetting the pointer will not overflow or go
1090     /// beyond the allocation that the pointer points into. It is up to the caller to ensure that
1091     /// the returned offset is correct in all terms other than alignment.
1092     ///
1093     /// # Panics
1094     ///
1095     /// The function panics if `align` is not a power-of-two.
1096     ///
1097     /// # Examples
1098     ///
1099     /// Accessing adjacent `u8` as `u16`
1100     ///
1101     /// ```
1102     /// # fn foo(n: usize) {
1103     /// # use std::mem::align_of;
1104     /// # unsafe {
1105     /// let x = [5u8, 6u8, 7u8, 8u8, 9u8];
1106     /// let ptr = &x[n] as *const u8;
1107     /// let offset = ptr.align_offset(align_of::<u16>());
1108     /// if offset < x.len() - n - 1 {
1109     ///     let u16_ptr = ptr.add(offset) as *const u16;
1110     ///     assert_ne!(*u16_ptr, 500);
1111     /// } else {
1112     ///     // while the pointer can be aligned via `offset`, it would point
1113     ///     // outside the allocation
1114     /// }
1115     /// # } }
1116     /// ```
1117     #[stable(feature = "align_offset", since = "1.36.0")]
1118     pub fn align_offset(self, align: usize) -> usize
1119     where
1120         T: Sized,
1121     {
1122         if !align.is_power_of_two() {
1123             panic!("align_offset: align is not a power-of-two");
1124         }
1125         // SAFETY: `align` has been checked to be a power of 2 above
1126         unsafe { align_offset(self, align) }
1127     }
1128 }
1129
1130 #[lang = "mut_slice_ptr"]
1131 impl<T> *mut [T] {
1132     /// Returns the length of a raw slice.
1133     ///
1134     /// The returned value is the number of **elements**, not the number of bytes.
1135     ///
1136     /// This function is safe, even when the raw slice cannot be cast to a slice
1137     /// reference because the pointer is null or unaligned.
1138     ///
1139     /// # Examples
1140     ///
1141     /// ```rust
1142     /// #![feature(slice_ptr_len)]
1143     /// use std::ptr;
1144     ///
1145     /// let slice: *mut [i8] = ptr::slice_from_raw_parts_mut(ptr::null_mut(), 3);
1146     /// assert_eq!(slice.len(), 3);
1147     /// ```
1148     #[inline]
1149     #[unstable(feature = "slice_ptr_len", issue = "71146")]
1150     #[rustc_const_unstable(feature = "const_slice_ptr_len", issue = "71146")]
1151     pub const fn len(self) -> usize {
1152         // SAFETY: this is safe because `*const [T]` and `FatPtr<T>` have the same layout.
1153         // Only `std` can make this guarantee.
1154         unsafe { Repr { rust_mut: self }.raw }.len
1155     }
1156
1157     /// Returns a raw pointer to the slice's buffer.
1158     ///
1159     /// This is equivalent to casting `self` to `*mut T`, but more type-safe.
1160     ///
1161     /// # Examples
1162     ///
1163     /// ```rust
1164     /// #![feature(slice_ptr_get)]
1165     /// use std::ptr;
1166     ///
1167     /// let slice: *mut [i8] = ptr::slice_from_raw_parts_mut(ptr::null_mut(), 3);
1168     /// assert_eq!(slice.as_mut_ptr(), 0 as *mut i8);
1169     /// ```
1170     #[inline]
1171     #[unstable(feature = "slice_ptr_get", issue = "74265")]
1172     #[rustc_const_unstable(feature = "slice_ptr_get", issue = "74265")]
1173     pub const fn as_mut_ptr(self) -> *mut T {
1174         self as *mut T
1175     }
1176
1177     /// Returns a raw pointer to an element or subslice, without doing bounds
1178     /// checking.
1179     ///
1180     /// Calling this method with an out-of-bounds index or when `self` is not dereferencable
1181     /// is *[undefined behavior]* even if the resulting pointer is not used.
1182     ///
1183     /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
1184     ///
1185     /// # Examples
1186     ///
1187     /// ```
1188     /// #![feature(slice_ptr_get)]
1189     ///
1190     /// let x = &mut [1, 2, 4] as *mut [i32];
1191     ///
1192     /// unsafe {
1193     ///     assert_eq!(x.get_unchecked_mut(1), x.as_mut_ptr().add(1));
1194     /// }
1195     /// ```
1196     #[unstable(feature = "slice_ptr_get", issue = "74265")]
1197     #[inline]
1198     pub unsafe fn get_unchecked_mut<I>(self, index: I) -> *mut I::Output
1199     where
1200         I: SliceIndex<[T]>,
1201     {
1202         // SAFETY: the caller ensures that `self` is dereferencable and `index` in-bounds.
1203         unsafe { index.get_unchecked_mut(self) }
1204     }
1205
1206     /// Returns `None` if the pointer is null, or else returns a shared slice to
1207     /// the value wrapped in `Some`. In contrast to [`as_ref`], this does not require
1208     /// that the value has to be initialized.
1209     ///
1210     /// For the mutable counterpart see [`as_uninit_slice_mut`].
1211     ///
1212     /// [`as_ref`]: #method.as_ref-1
1213     /// [`as_uninit_slice_mut`]: #method.as_uninit_slice_mut
1214     ///
1215     /// # Safety
1216     ///
1217     /// When calling this method, you have to ensure that *either* the pointer is NULL *or*
1218     /// all of the following is true:
1219     ///
1220     /// * The pointer must be [valid] for reads for `ptr.len() * mem::size_of::<T>()` many bytes,
1221     ///   and it must be properly aligned. This means in particular:
1222     ///
1223     ///     * The entire memory range of this slice must be contained within a single allocated object!
1224     ///       Slices can never span across multiple allocated objects.
1225     ///
1226     ///     * The pointer must be aligned even for zero-length slices. One
1227     ///       reason for this is that enum layout optimizations may rely on references
1228     ///       (including slices of any length) being aligned and non-null to distinguish
1229     ///       them from other data. You can obtain a pointer that is usable as `data`
1230     ///       for zero-length slices using [`NonNull::dangling()`].
1231     ///
1232     /// * The total size `ptr.len() * mem::size_of::<T>()` of the slice must be no larger than `isize::MAX`.
1233     ///   See the safety documentation of [`pointer::offset`].
1234     ///
1235     /// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
1236     ///   arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
1237     ///   In particular, for the duration of this lifetime, the memory the pointer points to must
1238     ///   not get mutated (except inside `UnsafeCell`).
1239     ///
1240     /// This applies even if the result of this method is unused!
1241     ///
1242     /// See also [`slice::from_raw_parts`][].
1243     ///
1244     /// [valid]: crate::ptr#safety
1245     /// [`NonNull::dangling()`]: NonNull::dangling
1246     /// [`pointer::offset`]: ../std/primitive.pointer.html#method.offset
1247     #[inline]
1248     #[unstable(feature = "ptr_as_uninit", issue = "75402")]
1249     pub unsafe fn as_uninit_slice<'a>(self) -> Option<&'a [MaybeUninit<T>]> {
1250         if self.is_null() {
1251             None
1252         } else {
1253             // SAFETY: the caller must uphold the safety contract for `as_uninit_slice`.
1254             Some(unsafe { slice::from_raw_parts(self as *const MaybeUninit<T>, self.len()) })
1255         }
1256     }
1257
1258     /// Returns `None` if the pointer is null, or else returns a unique slice to
1259     /// the value wrapped in `Some`. In contrast to [`as_mut`], this does not require
1260     /// that the value has to be initialized.
1261     ///
1262     /// For the shared counterpart see [`as_uninit_slice`].
1263     ///
1264     /// [`as_mut`]: #method.as_mut
1265     /// [`as_uninit_slice`]: #method.as_uninit_slice-1
1266     ///
1267     /// # Safety
1268     ///
1269     /// When calling this method, you have to ensure that *either* the pointer is NULL *or*
1270     /// all of the following is true:
1271     ///
1272     /// * The pointer must be [valid] for reads and writes for `ptr.len() * mem::size_of::<T>()`
1273     ///   many bytes, and it must be properly aligned. This means in particular:
1274     ///
1275     ///     * The entire memory range of this slice must be contained within a single allocated object!
1276     ///       Slices can never span across multiple allocated objects.
1277     ///
1278     ///     * The pointer must be aligned even for zero-length slices. One
1279     ///       reason for this is that enum layout optimizations may rely on references
1280     ///       (including slices of any length) being aligned and non-null to distinguish
1281     ///       them from other data. You can obtain a pointer that is usable as `data`
1282     ///       for zero-length slices using [`NonNull::dangling()`].
1283     ///
1284     /// * The total size `ptr.len() * mem::size_of::<T>()` of the slice must be no larger than `isize::MAX`.
1285     ///   See the safety documentation of [`pointer::offset`].
1286     ///
1287     /// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
1288     ///   arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
1289     ///   In particular, for the duration of this lifetime, the memory the pointer points to must
1290     ///   not get accessed (read or written) through any other pointer.
1291     ///
1292     /// This applies even if the result of this method is unused!
1293     ///
1294     /// See also [`slice::from_raw_parts_mut`][].
1295     ///
1296     /// [valid]: crate::ptr#safety
1297     /// [`NonNull::dangling()`]: NonNull::dangling
1298     /// [`pointer::offset`]: ../std/primitive.pointer.html#method.offset
1299     #[inline]
1300     #[unstable(feature = "ptr_as_uninit", issue = "75402")]
1301     pub unsafe fn as_uninit_slice_mut<'a>(self) -> Option<&'a mut [MaybeUninit<T>]> {
1302         if self.is_null() {
1303             None
1304         } else {
1305             // SAFETY: the caller must uphold the safety contract for `as_uninit_slice_mut`.
1306             Some(unsafe { slice::from_raw_parts_mut(self as *mut MaybeUninit<T>, self.len()) })
1307         }
1308     }
1309 }
1310
1311 // Equality for pointers
1312 #[stable(feature = "rust1", since = "1.0.0")]
1313 impl<T: ?Sized> PartialEq for *mut T {
1314     #[inline]
1315     fn eq(&self, other: &*mut T) -> bool {
1316         *self == *other
1317     }
1318 }
1319
1320 #[stable(feature = "rust1", since = "1.0.0")]
1321 impl<T: ?Sized> Eq for *mut T {}
1322
1323 #[stable(feature = "rust1", since = "1.0.0")]
1324 impl<T: ?Sized> Ord for *mut T {
1325     #[inline]
1326     fn cmp(&self, other: &*mut T) -> Ordering {
1327         if self < other {
1328             Less
1329         } else if self == other {
1330             Equal
1331         } else {
1332             Greater
1333         }
1334     }
1335 }
1336
1337 #[stable(feature = "rust1", since = "1.0.0")]
1338 impl<T: ?Sized> PartialOrd for *mut T {
1339     #[inline]
1340     fn partial_cmp(&self, other: &*mut T) -> Option<Ordering> {
1341         Some(self.cmp(other))
1342     }
1343
1344     #[inline]
1345     fn lt(&self, other: &*mut T) -> bool {
1346         *self < *other
1347     }
1348
1349     #[inline]
1350     fn le(&self, other: &*mut T) -> bool {
1351         *self <= *other
1352     }
1353
1354     #[inline]
1355     fn gt(&self, other: &*mut T) -> bool {
1356         *self > *other
1357     }
1358
1359     #[inline]
1360     fn ge(&self, other: &*mut T) -> bool {
1361         *self >= *other
1362     }
1363 }