Skip to content

Commit fef3404

Browse files
ronnodasmeithecatte
authored andcommitted
added from_bits{...} to BitFlag
1 parent c0654ac commit fef3404

File tree

1 file changed

+102
-0
lines changed

1 file changed

+102
-0
lines changed

src/lib.rs

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,108 @@ pub trait BitFlag: Copy + Clone + 'static + _internal::RawBitFlags {
181181
fn all() -> BitFlags<Self> {
182182
BitFlags::all()
183183
}
184+
185+
/// Create a `BitFlags` if the raw value provided does not contain
186+
/// any illegal flags.
187+
///
188+
/// This is a convenience reexport of [`BitFlags::from_bits`]. It can be called
189+
/// with `MyFlag::from_bits(bits)`, thus bypassing the need for type hints in
190+
/// some situations.
191+
///
192+
/// ```
193+
/// # use enumflags2::{bitflags, BitFlags};
194+
/// #[bitflags]
195+
/// #[repr(u8)]
196+
/// #[derive(Clone, Copy, PartialEq, Eq, Debug)]
197+
/// enum MyFlag {
198+
/// One = 1 << 0,
199+
/// Two = 1 << 1,
200+
/// Three = 1 << 2,
201+
/// }
202+
///
203+
/// use enumflags2::BitFlag;
204+
///
205+
/// let from_bits = MyFlag::from_bits(0b11).unwrap();
206+
/// assert_eq!(from_bits.contains(MyFlag::One), true);
207+
/// assert_eq!(from_bits.contains(MyFlag::Two), true);
208+
/// assert_eq!(from_bits.contains(MyFlag::Three), false);
209+
/// let invalid = MyFlag::from_bits(1 << 3);
210+
/// assert!(invalid.is_err());
211+
/// ```
212+
#[inline]
213+
fn from_bits(bits: Self::Numeric) -> Result<BitFlags<Self>, FromBitsError<Self>> {
214+
BitFlags::from_bits(bits)
215+
}
216+
217+
/// Create a `BitFlags` from an underlying bitwise value. If any
218+
/// invalid bits are set, ignore them.
219+
///
220+
/// This is a convenience reexport of [`BitFlags::from_bits_truncate`]. It can be
221+
/// called with `MyFlag::from_bits_truncate(bits)`, thus bypassing the need for
222+
/// type hints in some situations.
223+
///
224+
/// ```
225+
/// # use enumflags2::{bitflags, BitFlags};
226+
/// #[bitflags]
227+
/// #[repr(u8)]
228+
/// #[derive(Clone, Copy, PartialEq, Eq)]
229+
/// enum MyFlag {
230+
/// One = 1 << 0,
231+
/// Two = 1 << 1,
232+
/// Three = 1 << 2,
233+
/// }
234+
///
235+
/// use enumflags2::BitFlag;
236+
///
237+
/// let from_bits = MyFlag::from_bits_truncate(0b1_1011);
238+
/// assert_eq!(from_bits.contains(MyFlag::One), true);
239+
/// assert_eq!(from_bits.contains(MyFlag::Two), true);
240+
/// assert_eq!(from_bits.contains(MyFlag::Three), false);
241+
/// ```
242+
#[inline]
243+
fn from_bits_truncate(bits: Self::Numeric) -> BitFlags<Self> {
244+
BitFlags::from_bits_truncate(bits)
245+
}
246+
247+
/// Create a `BitFlags` unsafely, without checking if the bits form
248+
/// a valid bit pattern for the type.
249+
///
250+
/// Consider using [`from_bits`][BitFlag::from_bits]
251+
/// or [`from_bits_truncate`][BitFlag::from_bits_truncate] instead.
252+
///
253+
///
254+
/// This is a convenience reexport of [`BitFlags::from_bits_unchecked`]. It can be
255+
/// called with `MyFlag::from_bits_unchecked(bits)`, thus bypassing the need for
256+
/// type hints in some situations.
257+
///
258+
/// ```
259+
/// # use enumflags2::{bitflags, BitFlags};
260+
/// #[bitflags]
261+
/// #[repr(u8)]
262+
/// #[derive(Clone, Copy, PartialEq, Eq)]
263+
/// enum MyFlag {
264+
/// One = 1 << 0,
265+
/// Two = 1 << 1,
266+
/// Three = 1 << 2,
267+
/// }
268+
///
269+
/// use enumflags2::BitFlag;
270+
///
271+
/// unsafe {
272+
/// let from_bits = MyFlag::from_bits_unchecked(0b011);
273+
/// assert_eq!(from_bits.contains(MyFlag::One), true);
274+
/// assert_eq!(from_bits.contains(MyFlag::Two), true);
275+
/// assert_eq!(from_bits.contains(MyFlag::Three), false);
276+
/// }
277+
/// ```
278+
///
279+
/// # Safety
280+
///
281+
/// All bits set in `val` must correspond to a value of the enum.
282+
#[inline]
283+
unsafe fn from_bits_unchecked(bits: Self::Numeric) -> BitFlags<Self> {
284+
BitFlags::from_bits_unchecked(bits)
285+
}
184286
}
185287

186288
/// While the module is public, this is only the case because it needs to be

0 commit comments

Comments
 (0)