Coverage Report

Created: 2025-07-11 07:11

/rust/registry/src/index.crates.io-6f17d22bba15001f/bitflags-2.9.1/src/internal.rs
Line
Count
Source (jump to first uncovered line)
1
//! Generate the internal `bitflags`-facing flags type.
2
//!
3
//! The code generated here is owned by `bitflags`, but still part of its public API.
4
//! Changes to the types generated here need to be considered like any other public API change.
5
6
/// Declare the `bitflags`-facing bitflags struct.
7
///
8
/// This type is part of the `bitflags` crate's public API, but not part of the user's.
9
#[macro_export]
10
#[doc(hidden)]
11
macro_rules! __declare_internal_bitflags {
12
    (
13
        $vis:vis struct $InternalBitFlags:ident: $T:ty
14
    ) => {
15
        // NOTE: The ABI of this type is _guaranteed_ to be the same as `T`
16
        // This is relied on by some external libraries like `bytemuck` to make
17
        // its `unsafe` trait impls sound.
18
        #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
19
        #[repr(transparent)]
20
        $vis struct $InternalBitFlags($T);
21
    };
22
}
23
24
/// Implement functions on the private (bitflags-facing) bitflags type.
25
///
26
/// Methods and trait implementations can be freely added here without breaking end-users.
27
/// If we want to expose new functionality to `#[derive]`, this is the place to do it.
28
#[macro_export]
29
#[doc(hidden)]
30
macro_rules! __impl_internal_bitflags {
31
    (
32
        $InternalBitFlags:ident: $T:ty, $PublicBitFlags:ident {
33
            $(
34
                $(#[$inner:ident $($args:tt)*])*
35
                const $Flag:tt = $value:expr;
36
            )*
37
        }
38
    ) => {
39
        // NOTE: This impl is also used to prevent using bits types from non-primitive types
40
        // in the `bitflags` macro. If this approach is changed, this guard will need to be
41
        // retained somehow
42
        impl $crate::__private::PublicFlags for $PublicBitFlags {
43
            type Primitive = $T;
44
            type Internal = $InternalBitFlags;
45
        }
46
47
        impl $crate::__private::core::default::Default for $InternalBitFlags {
48
            #[inline]
49
0
            fn default() -> Self {
50
0
                $InternalBitFlags::empty()
51
0
            }
52
        }
53
54
        impl $crate::__private::core::fmt::Debug for $InternalBitFlags {
55
0
            fn fmt(&self, f: &mut $crate::__private::core::fmt::Formatter<'_>) -> $crate::__private::core::fmt::Result {
56
0
                if self.is_empty() {
57
                    // If no flags are set then write an empty hex flag to avoid
58
                    // writing an empty string. In some contexts, like serialization,
59
                    // an empty string is preferable, but it may be unexpected in
60
                    // others for a format not to produce any output.
61
                    //
62
                    // We can remove this `0x0` and remain compatible with `FromStr`,
63
                    // because an empty string will still parse to an empty set of flags,
64
                    // just like `0x0` does.
65
0
                    $crate::__private::core::write!(f, "{:#x}", <$T as $crate::Bits>::EMPTY)
66
                } else {
67
0
                    $crate::__private::core::fmt::Display::fmt(self, f)
68
                }
69
0
            }
70
0
        }
71
0
72
0
        impl $crate::__private::core::fmt::Display for $InternalBitFlags {
73
0
            fn fmt(&self, f: &mut $crate::__private::core::fmt::Formatter<'_>) -> $crate::__private::core::fmt::Result {
74
0
                $crate::parser::to_writer(&$PublicBitFlags(*self), f)
75
0
            }
76
        }
77
78
        impl $crate::__private::core::str::FromStr for $InternalBitFlags {
79
            type Err = $crate::parser::ParseError;
80
81
0
            fn from_str(s: &str) -> $crate::__private::core::result::Result<Self, Self::Err> {
82
0
                $crate::parser::from_str::<$PublicBitFlags>(s).map(|flags| flags.0)
83
0
            }
84
        }
85
86
        impl $crate::__private::core::convert::AsRef<$T> for $InternalBitFlags {
87
0
            fn as_ref(&self) -> &$T {
88
0
                &self.0
89
0
            }
90
        }
91
92
        impl $crate::__private::core::convert::From<$T> for $InternalBitFlags {
93
0
            fn from(bits: $T) -> Self {
94
0
                Self::from_bits_retain(bits)
95
0
            }
96
        }
97
98
        // The internal flags type offers a similar API to the public one
99
100
        $crate::__impl_public_bitflags! {
101
            $InternalBitFlags: $T, $PublicBitFlags {
102
                $(
103
                    $(#[$inner $($args)*])*
104
                    const $Flag = $value;
105
                )*
106
            }
107
        }
108
109
        $crate::__impl_public_bitflags_ops! {
110
            $InternalBitFlags
111
        }
112
113
        $crate::__impl_public_bitflags_iter! {
114
            $InternalBitFlags: $T, $PublicBitFlags
115
        }
116
117
        impl $InternalBitFlags {
118
            /// Returns a mutable reference to the raw value of the flags currently stored.
119
            #[inline]
120
0
            pub fn bits_mut(&mut self) -> &mut $T {
121
0
                &mut self.0
122
0
            }
123
        }
124
    };
125
}