@@ -1064,7 +1064,43 @@ impl<T: ?Sized> *const T {
10641064 copy_nonoverlapping ( self , dest, count)
10651065 }
10661066
1067-
1067+ /// Computes the byte offset that needs to be applied in order to
1068+ /// make the pointer aligned to `align`.
1069+ /// If it is not possible to align the pointer, the implementation returns
1070+ /// `usize::max_value()`.
1071+ ///
1072+ /// There are no guarantees whatsover that offsetting the pointer will not
1073+ /// overflow or go beyond the allocation that the pointer points into.
1074+ /// It is up to the caller to ensure that the returned offset is correct
1075+ /// in all terms other than alignment.
1076+ ///
1077+ /// # Examples
1078+ ///
1079+ /// Accessing adjacent `u8` as `u16`
1080+ ///
1081+ /// ```
1082+ /// # #![feature(align_offset)]
1083+ /// # fn foo(n: usize) {
1084+ /// # use std::mem::align_of;
1085+ /// # unsafe {
1086+ /// let x = [5u8, 6u8, 7u8, 8u8, 9u8];
1087+ /// let ptr = &x[n] as *const u8;
1088+ /// let offset = ptr.align_offset(align_of::<u16>());
1089+ /// if offset < x.len() - n - 1 {
1090+ /// let u16_ptr = ptr.offset(offset as isize) as *const u16;
1091+ /// assert_ne!(*u16_ptr, 500);
1092+ /// } else {
1093+ /// // while the pointer can be aligned via `offset`, it would point
1094+ /// // outside the allocation
1095+ /// }
1096+ /// # } }
1097+ /// ```
1098+ #[ unstable( feature = "align_offset" , issue = "44488" ) ]
1099+ pub fn align_offset ( self , align : usize ) -> usize {
1100+ unsafe {
1101+ intrinsics:: align_offset ( self as * const _ , align)
1102+ }
1103+ }
10681104}
10691105
10701106#[ lang = "mut_ptr" ]
@@ -1284,6 +1320,43 @@ impl<T: ?Sized> *mut T {
12841320 }
12851321 }
12861322
1323+ /// Computes the byte offset that needs to be applied in order to
1324+ /// make the pointer aligned to `align`.
1325+ /// If it is not possible to align the pointer, the implementation returns
1326+ /// `usize::max_value()`.
1327+ ///
1328+ /// There are no guarantees whatsover that offsetting the pointer will not
1329+ /// overflow or go beyond the allocation that the pointer points into.
1330+ /// It is up to the caller to ensure that the returned offset is correct
1331+ /// in all terms other than alignment.
1332+ ///
1333+ /// # Examples
1334+ ///
1335+ /// Accessing adjacent `u8` as `u16`
1336+ ///
1337+ /// ```
1338+ /// # #![feature(align_offset)]
1339+ /// # fn foo(n: usize) {
1340+ /// # use std::mem::align_of;
1341+ /// # unsafe {
1342+ /// let x = [5u8, 6u8, 7u8, 8u8, 9u8];
1343+ /// let ptr = &x[n] as *const u8;
1344+ /// let offset = ptr.align_offset(align_of::<u16>());
1345+ /// if offset < x.len() - n - 1 {
1346+ /// let u16_ptr = ptr.offset(offset as isize) as *const u16;
1347+ /// assert_ne!(*u16_ptr, 500);
1348+ /// } else {
1349+ /// // while the pointer can be aligned via `offset`, it would point
1350+ /// // outside the allocation
1351+ /// }
1352+ /// # } }
1353+ /// ```
1354+ #[ unstable( feature = "align_offset" , issue = "44488" ) ]
1355+ pub fn align_offset ( self , align : usize ) -> usize {
1356+ unsafe {
1357+ intrinsics:: align_offset ( self as * const _ , align)
1358+ }
1359+ }
12871360
12881361 /// Calculates the offset from a pointer (convenience for `.offset(count as isize)`).
12891362 ///
0 commit comments