//! Generate the user-facing flags type. //! //! The code here belongs to the end-user, so new trait implementations and methods can't be //! added without potentially breaking users.
/// Declare the user-facing bitflags struct. /// /// This type is guaranteed to be a newtype with a `bitflags`-facing type as its single field. #[macro_export] #[doc(hidden)]
macro_rules! __declare_public_bitflags {
(
$(#[$outer:meta])*
$vis:vis struct $PublicBitFlags:ident
) => {
$(#[$outer])*
$vis struct $PublicBitFlags(<$PublicBitFlags as $crate::__private::PublicFlags>::Internal);
};
}
/// Implement functions on the public (user-facing) bitflags type. /// /// We need to be careful about adding new methods and trait implementations here because they /// could conflict with items added by the end-user. #[macro_export] #[doc(hidden)]
macro_rules! __impl_public_bitflags_forward {
(
$(#[$outer:meta])*
$PublicBitFlags:ident: $T:ty, $InternalBitFlags:ident
) => {
$crate::__impl_bitflags! {
$(#[$outer])*
$PublicBitFlags: $T { fn empty() { Self($InternalBitFlags::empty())
}
/// Implement functions on the public (user-facing) bitflags type. /// /// We need to be careful about adding new methods and trait implementations here because they /// could conflict with items added by the end-user. #[macro_export] #[doc(hidden)]
macro_rules! __impl_public_bitflags {
(
$(#[$outer:meta])*
$BitFlags:ident: $T:ty, $PublicBitFlags:ident {
$(
$(#[$inner:ident $($args:tt)*])* const $Flag:tt = $value:expr;
)*
}
) => {
$crate::__impl_bitflags! {
$(#[$outer])*
$BitFlags: $T { fn empty() { Self(<$T as $crate::Bits>::EMPTY)
}
fn all() { letmut truncated = <$T as $crate::Bits>::EMPTY; letmut i = 0;
$(
$crate::__bitflags_expr_safe_attrs!(
$(#[$inner $($args)*])*
{{ let flag = <$PublicBitFlags as $crate::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}}
);
)*
let _ = i; Self::from_bits_retain(truncated)
}
fn bits(f) {
f.0
}
fn from_bits(bits) { let truncated = Self::from_bits_truncate(bits).0;
let _ = name;
$crate::__private::core::option::Option::None
}
fn is_empty(f) {
f.bits() == <$T as $crate::Bits>::EMPTY
}
fn is_all(f) { // NOTE: We check against `Self::all` here, not `Self::Bits::ALL` // because the set of all flags may not use all bits Self::all().bits() | f.bits() == f.bits()
}
/// Implement iterators on the public (user-facing) bitflags type. #[macro_export] #[doc(hidden)]
macro_rules! __impl_public_bitflags_iter {
(
$(#[$outer:meta])*
$BitFlags:ident: $T:ty, $PublicBitFlags:ident
) => {
$(#[$outer])* impl $BitFlags { /// Yield a set of contained flags values. /// /// Each yielded flags value will correspond to a defined named flag. Any unknown bits /// will be yielded together as a final flags value. #[inline] pubconstfn iter(&self) -> $crate::iter::Iter<$PublicBitFlags> {
$crate::iter::Iter::__private_const_new(
<$PublicBitFlags as $crate::Flags>::FLAGS,
$PublicBitFlags::from_bits_retain(self.bits()),
$PublicBitFlags::from_bits_retain(self.bits()),
)
}
/// Yield a set of contained named flags values. /// /// This method is like [`iter`](#method.iter), except only yields bits in contained named flags. /// Any unknown bits, or bits not corresponding to a contained flag will not be yielded. #[inline] pubconstfn iter_names(&self) -> $crate::iter::IterNames<$PublicBitFlags> {
$crate::iter::IterNames::__private_const_new(
<$PublicBitFlags as $crate::Flags>::FLAGS,
$PublicBitFlags::from_bits_retain(self.bits()),
$PublicBitFlags::from_bits_retain(self.bits()),
)
}
}
$(#[$outer:meta])* impl $crate::__private::core::iter::IntoIterator for $BitFlags { type Item = $PublicBitFlags; type IntoIter = $crate::iter::Iter<$PublicBitFlags>;
$(#[$outer])* impl $crate::__private::core::ops::BitOr for $PublicBitFlags { type Output = Self;
/// The bitwise or (`|`) of the bits in two flags values. #[inline] fn bitor(self, other: $PublicBitFlags) -> Self { self.union(other)
}
}
$(#[$outer])* impl $crate::__private::core::ops::BitOrAssign for $PublicBitFlags { /// The bitwise or (`|`) of the bits in two flags values. #[inline] fn bitor_assign(&mutself, other: Self) { self.insert(other);
}
}
$(#[$outer])* impl $crate::__private::core::ops::BitXor for $PublicBitFlags { type Output = Self;
/// The bitwise exclusive-or (`^`) of the bits in two flags values. #[inline] fn bitxor(self, other: Self) -> Self { self.symmetric_difference(other)
}
}
$(#[$outer])* impl $crate::__private::core::ops::BitXorAssign for $PublicBitFlags { /// The bitwise exclusive-or (`^`) of the bits in two flags values. #[inline] fn bitxor_assign(&mutself, other: Self) { self.toggle(other);
}
}
$(#[$outer])* impl $crate::__private::core::ops::BitAnd for $PublicBitFlags { type Output = Self;
/// The bitwise and (`&`) of the bits in two flags values. #[inline] fn bitand(self, other: Self) -> Self { self.intersection(other)
}
}
$(#[$outer])* impl $crate::__private::core::ops::BitAndAssign for $PublicBitFlags { /// The bitwise and (`&`) of the bits in two flags values. #[inline] fn bitand_assign(&mutself, other: Self) {
*self = Self::from_bits_retain(self.bits()).intersection(other);
}
}
$(#[$outer])* impl $crate::__private::core::ops::Sub for $PublicBitFlags { type Output = Self;
/// The intersection of a source flags value with the complement of a target flags value (`&!`).> /// /// This method is not equivalent to `self & !other` when `other` has unknown bits set. /// `difference` won't truncate `other`, but the `!` operator will. #[inline] fn sub(self, other: Self) -> Self { self.difference(other)
}
}
$(#[$outer])* impl $crate::__private::core::ops::SubAssign for $PublicBitFlags { /// The intersection of a source flags value with the complement of a target flags value (`&!`).> /// /// This method is not equivalent to `self & !other` when `other` has unknown bits set. /// `difference` won't truncate `other`, but the `!` operator will. #[inline] fn sub_assign(&mutself, other: Self) { self.remove(other);
}
}
$(#[$outer])* impl $crate::__private::core::ops::Not for $PublicBitFlags { type Output = Self;
/// The bitwise negation (`!`) of the bits in a flags value, truncating the result. #[inline] fn not(self) -> Self { self.complement()
}
}
$(#[$outer])* impl $crate::__private::core::iter::Extend<$PublicBitFlags> for $PublicBitFlags { /// The bitwise or (`|`) of the bits in each flags value. fn extend<T: $crate::__private::core::iter::IntoIterator<Item = Self>>(
&mutself,
iterator: T,
) { for item in iterator { self.insert(item)
}
}
}
$(#[$outer])* impl $crate::__private::core::iter::FromIterator<$PublicBitFlags> for $PublicBitFlags { /// The bitwise or (`|`) of the bits in each flags value. fn from_iter<T: $crate::__private::core::iter::IntoIterator<Item = Self>>(
iterator: T,
) -> Self { use $crate::__private::core::iter::Extend;
letmut result = Self::empty();
result.extend(iterator);
result
}
}
};
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.