impl more traits for ptr::Alignment, add mask method · rust-lang/rust@114873d (original) (raw)
`@@ -42,6 +42,7 @@ impl Alignment {
`
42
42
`` /// This provides the same numerical value as [mem::align_of
],
``
43
43
`` /// but in an Alignment
instead of a usize
.
``
44
44
`#[unstable(feature = "ptr_alignment_type", issue = "102070")]
`
``
45
`+
#[rustc_const_unstable(feature = "ptr_alignment_type", issue = "102070")]
`
45
46
`#[inline]
`
46
47
`pub const fn of() -> Self {
`
47
48
`// SAFETY: rustc ensures that type alignment is always a power of two.
`
`@@ -53,6 +54,7 @@ impl Alignment {
`
53
54
`///
`
54
55
`` /// Note that 0
is not a power of two, nor a valid alignment.
``
55
56
`#[unstable(feature = "ptr_alignment_type", issue = "102070")]
`
``
57
`+
#[rustc_const_unstable(feature = "ptr_alignment_type", issue = "102070")]
`
56
58
`#[inline]
`
57
59
`pub const fn new(align: usize) -> Option {
`
58
60
`if align.is_power_of_two() {
`
`@@ -98,6 +100,7 @@ impl Alignment {
`
98
100
``
99
101
`` /// Returns the alignment as a [NonZeroUsize
]
``
100
102
`#[unstable(feature = "ptr_alignment_type", issue = "102070")]
`
``
103
`+
#[rustc_const_unstable(feature = "ptr_alignment_type", issue = "102070")]
`
101
104
`#[inline]
`
102
105
`pub const fn as_nonzero(self) -> NonZeroUsize {
`
103
106
`// SAFETY: All the discriminants are non-zero.
`
`@@ -118,10 +121,42 @@ impl Alignment {
`
118
121
`/// assert_eq!(Alignment::new(1024).unwrap().log2(), 10);
`
119
122
```` /// ```
`120`
`123`
`#[unstable(feature = "ptr_alignment_type", issue = "102070")]
`
``
`124`
`+
#[rustc_const_unstable(feature = "ptr_alignment_type", issue = "102070")]
`
`121`
`125`
`#[inline]
`
`122`
``
`-
pub fn log2(self) -> u32 {
`
``
`126`
`+
pub const fn log2(self) -> u32 {
`
`123`
`127`
`self.as_nonzero().trailing_zeros()
`
`124`
`128`
`}
`
``
`129`
`+`
``
`130`
`+
/// Returns a bit mask that can be used to match this alignment.
`
``
`131`
`+
///
`
``
`132`
`` +
/// This is equivalent to `!(self.as_usize() - 1)`.
``
``
`133`
`+
///
`
``
`134`
`+
/// # Examples
`
``
`135`
`+
///
`
``
`136`
```` +
/// ```
``
137
`+
/// #![feature(ptr_alignment_type)]
`
``
138
`+
/// #![feature(ptr_mask)]
`
``
139
`+
/// use std::ptr::{Alignment, NonNull};
`
``
140
`+
///
`
``
141
`+
/// #[repr(align(1))] struct Align1(u8);
`
``
142
`+
/// #[repr(align(2))] struct Align2(u16);
`
``
143
`+
/// #[repr(align(4))] struct Align4(u32);
`
``
144
`+
/// let one = <NonNull>::dangling().as_ptr();
`
``
145
`+
/// let two = <NonNull>::dangling().as_ptr();
`
``
146
`+
/// let four = <NonNull>::dangling().as_ptr();
`
``
147
`+
///
`
``
148
`+
/// assert_eq!(four.mask(Alignment::of::().mask()), four);
`
``
149
`+
/// assert_eq!(four.mask(Alignment::of::().mask()), four);
`
``
150
`+
/// assert_eq!(four.mask(Alignment::of::().mask()), four);
`
``
151
`+
/// assert_ne!(one.mask(Alignment::of::().mask()), one);
`
``
152
/// ```
``
153
`+
#[unstable(feature = "ptr_alignment_type", issue = "102070")]
`
``
154
`+
#[rustc_const_unstable(feature = "ptr_alignment_type", issue = "102070")]
`
``
155
`+
#[inline]
`
``
156
`+
pub const fn mask(self) -> usize {
`
``
157
`+
// SAFETY: The alignment is always nonzero, and therefore decrementing won't overflow.
`
``
158
`+
!(unsafe { self.as_usize().unchecked_sub(1) })
`
``
159
`+
}
`
125
160
`}
`
126
161
``
127
162
`#[unstable(feature = "ptr_alignment_type", issue = "102070")]
`
`@@ -193,6 +228,14 @@ impl hash::Hash for Alignment {
`
193
228
`}
`
194
229
`}
`
195
230
``
``
231
`` +
/// Returns [Alignment::MIN
], which is valid for any type.
``
``
232
`+
#[unstable(feature = "ptr_alignment_type", issue = "102070")]
`
``
233
`+
impl Default for Alignment {
`
``
234
`+
fn default() -> Alignment {
`
``
235
`+
Alignment::MIN
`
``
236
`+
}
`
``
237
`+
}
`
``
238
+
196
239
`#[cfg(target_pointer_width = "16")]
`
197
240
`type AlignmentEnum = AlignmentEnum16;
`
198
241
`#[cfg(target_pointer_width = "32")]
`