@@ -85,6 +85,20 @@ impl<T: ?Sized> !Send for NonNull<T> {}
8585impl < T : ?Sized > !Sync for NonNull < T > { }
8686
8787impl < T : Sized > NonNull < T > {
88+ /// Creates a pointer with the given address and no [provenance][crate::ptr#provenance].
89+ ///
90+ /// For more details, see the equivalent method on a raw pointer, [`ptr::without_provenance_mut`].
91+ ///
92+ /// This is a [Strict Provenance][crate::ptr#strict-provenance] API.
93+ #[ unstable( feature = "nonnull_provenance" , issue = "135243" ) ]
94+ pub const fn without_provenance ( addr : NonZero < usize > ) -> Self {
95+ // SAFETY: we know `addr` is non-zero.
96+ unsafe {
97+ let ptr = crate :: ptr:: without_provenance_mut ( addr. get ( ) ) ;
98+ NonNull :: new_unchecked ( ptr)
99+ }
100+ }
101+
88102/// Creates a new `NonNull` that is dangling, but well-aligned.
89103///
90104/// This is useful for initializing types which lazily allocate, like
@@ -116,6 +130,21 @@ impl<T: Sized> NonNull<T> {
116130}
117131}
118132
133+ /// Converts an address back to a mutable pointer, picking up some previously 'exposed'
134+ /// [provenance][crate::ptr#provenance].
135+ ///
136+ /// For more details, see the equivalent method on a raw pointer, [`ptr::with_exposed_provenance_mut`].
137+ ///
138+ /// This is an [Exposed Provenance][crate::ptr#exposed-provenance] API.
139+ #[ unstable( feature = "nonnull_provenance" , issue = "135243" ) ]
140+ pub fn with_exposed_provenance ( addr : NonZero < usize > ) -> Self {
141+ // SAFETY: we know `addr` is non-zero.
142+ unsafe {
143+ let ptr = crate :: ptr:: with_exposed_provenance_mut ( addr. get ( ) ) ;
144+ NonNull :: new_unchecked ( ptr)
145+ }
146+ }
147+
119148/// Returns a shared references to the value. In contrast to [`as_ref`], this does not require
120149/// that the value has to be initialized.
121150///
@@ -282,7 +311,7 @@ impl<T: ?Sized> NonNull<T> {
282311
283312/// Gets the "address" portion of the pointer.
284313///
285- /// For more details see the equivalent method on a raw pointer, [`pointer::addr`].
314+ /// For more details, see the equivalent method on a raw pointer, [`pointer::addr`].
286315///
287316/// This is a [Strict Provenance][crate::ptr#strict-provenance] API.
288317#[ must_use]
@@ -294,10 +323,23 @@ impl<T: ?Sized> NonNull<T> {
294323unsafe { NonZero :: new_unchecked ( self . as_ptr ( ) . addr ( ) ) }
295324}
296325
326+ /// Exposes the ["provenance"][crate::ptr#provenance] part of the pointer for future use in
327+ /// [`with_exposed_provenance`][NonNull::with_exposed_provenance] and returns the "address" portion.
328+ ///
329+ /// For more details, see the equivalent method on a raw pointer, [`pointer::expose_provenance`].
330+ ///
331+ /// This is an [Exposed Provenance][crate::ptr#exposed-provenance] API.
332+ #[ unstable( feature = "nonnull_provenance" , issue = "135243" ) ]
333+ pub fn expose_provenance ( self ) -> NonZero < usize > {
334+ // SAFETY: The pointer is guaranteed by the type to be non-null,
335+ // meaning that the address will be non-zero.
336+ unsafe { NonZero :: new_unchecked ( self . as_ptr ( ) . expose_provenance ( ) ) }
337+ }
338+
297339/// Creates a new pointer with the given address and the [provenance][crate::ptr#provenance] of
298340/// `self`.
299341///
300- /// For more details see the equivalent method on a raw pointer, [`pointer::with_addr`].
342+ /// For more details, see the equivalent method on a raw pointer, [`pointer::with_addr`].
301343///
302344/// This is a [Strict Provenance][crate::ptr#strict-provenance] API.
303345#[ must_use]
@@ -311,7 +353,7 @@ impl<T: ?Sized> NonNull<T> {
311353/// Creates a new pointer by mapping `self`'s address to a new one, preserving the
312354/// [provenance][crate::ptr#provenance] of `self`.
313355///
314- /// For more details see the equivalent method on a raw pointer, [`pointer::map_addr`].
356+ /// For more details, see the equivalent method on a raw pointer, [`pointer::map_addr`].
315357///
316358/// This is a [Strict Provenance][crate::ptr#strict-provenance] API.
317359#[ must_use]
0 commit comments