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