1pub(crate) mod __private {
69    #[cfg(feature = "serde")]
70    pub use serde;
71
72    #[cfg(feature = "arbitrary")]
73    pub use arbitrary;
74
75    #[cfg(feature = "bytemuck")]
76    pub use bytemuck;
77}
78
79#[macro_export]
81#[doc(hidden)]
82macro_rules! __impl_external_bitflags {
83    (
84        $InternalBitFlags:ident: $T:ty, $PublicBitFlags:ident {
85            $(
86                $(#[$inner:ident $($args:tt)*])*
87                const $Flag:tt;
88            )*
89        }
90    ) => {
91        $crate::__impl_external_bitflags_serde! {
96            $InternalBitFlags: $T, $PublicBitFlags {
97                $(
98                    $(#[$inner $($args)*])*
99                    const $Flag;
100                )*
101            }
102        }
103
104        $crate::__impl_external_bitflags_arbitrary! {
105            $InternalBitFlags: $T, $PublicBitFlags {
106                $(
107                    $(#[$inner $($args)*])*
108                    const $Flag;
109                )*
110            }
111        }
112
113        $crate::__impl_external_bitflags_bytemuck! {
114            $InternalBitFlags: $T, $PublicBitFlags {
115                $(
116                    $(#[$inner $($args)*])*
117                    const $Flag;
118                )*
119            }
120        }
121    };
122}
123
124#[cfg(feature = "serde")]
125pub mod serde;
126
127#[macro_export]
129#[doc(hidden)]
130#[cfg(feature = "serde")]
131macro_rules! __impl_external_bitflags_serde {
132    (
133        $InternalBitFlags:ident: $T:ty, $PublicBitFlags:ident {
134            $(
135                $(#[$inner:ident $($args:tt)*])*
136                const $Flag:tt;
137            )*
138        }
139    ) => {
140        impl $crate::__private::serde::Serialize for $InternalBitFlags {
141            fn serialize<S: $crate::__private::serde::Serializer>(
142                &self,
143                serializer: S,
144            ) -> $crate::__private::core::result::Result<S::Ok, S::Error> {
145                $crate::serde::serialize(
146                    &$PublicBitFlags::from_bits_retain(self.bits()),
147                    serializer,
148                )
149            }
150        }
151
152        impl<'de> $crate::__private::serde::Deserialize<'de> for $InternalBitFlags {
153            fn deserialize<D: $crate::__private::serde::Deserializer<'de>>(
154                deserializer: D,
155            ) -> $crate::__private::core::result::Result<Self, D::Error> {
156                let flags: $PublicBitFlags = $crate::serde::deserialize(deserializer)?;
157
158                Ok(flags.0)
159            }
160        }
161    };
162}
163
164#[macro_export]
165#[doc(hidden)]
166#[cfg(not(feature = "serde"))]
167macro_rules! __impl_external_bitflags_serde {
168    (
169        $InternalBitFlags:ident: $T:ty, $PublicBitFlags:ident {
170            $(
171                $(#[$inner:ident $($args:tt)*])*
172                const $Flag:tt;
173            )*
174        }
175    ) => {};
176}
177
178#[cfg(feature = "arbitrary")]
179pub mod arbitrary;
180
181#[cfg(feature = "bytemuck")]
182mod bytemuck;
183
184#[macro_export]
186#[doc(hidden)]
187#[cfg(feature = "arbitrary")]
188macro_rules! __impl_external_bitflags_arbitrary {
189    (
190            $InternalBitFlags:ident: $T:ty, $PublicBitFlags:ident {
191                $(
192                    $(#[$inner:ident $($args:tt)*])*
193                    const $Flag:tt;
194                )*
195            }
196    ) => {
197        impl<'a> $crate::__private::arbitrary::Arbitrary<'a> for $InternalBitFlags {
198            fn arbitrary(
199                u: &mut $crate::__private::arbitrary::Unstructured<'a>,
200            ) -> $crate::__private::arbitrary::Result<Self> {
201                $crate::arbitrary::arbitrary::<$PublicBitFlags>(u).map(|flags| flags.0)
202            }
203        }
204    };
205}
206
207#[macro_export]
208#[doc(hidden)]
209#[cfg(not(feature = "arbitrary"))]
210macro_rules! __impl_external_bitflags_arbitrary {
211    (
212        $InternalBitFlags:ident: $T:ty, $PublicBitFlags:ident {
213            $(
214                $(#[$inner:ident $($args:tt)*])*
215                const $Flag:tt;
216            )*
217        }
218    ) => {};
219}
220
221#[macro_export]
223#[doc(hidden)]
224#[cfg(feature = "bytemuck")]
225macro_rules! __impl_external_bitflags_bytemuck {
226    (
227        $InternalBitFlags:ident: $T:ty, $PublicBitFlags:ident {
228            $(
229                $(#[$inner:ident $($args:tt)*])*
230                const $Flag:tt;
231            )*
232        }
233    ) => {
234        unsafe impl $crate::__private::bytemuck::Pod for $InternalBitFlags where
237            $T: $crate::__private::bytemuck::Pod
238        {
239        }
240
241        unsafe impl $crate::__private::bytemuck::Zeroable for $InternalBitFlags where
244            $T: $crate::__private::bytemuck::Zeroable
245        {
246        }
247    };
248}
249
250#[macro_export]
251#[doc(hidden)]
252#[cfg(not(feature = "bytemuck"))]
253macro_rules! __impl_external_bitflags_bytemuck {
254    (
255        $InternalBitFlags:ident: $T:ty, $PublicBitFlags:ident {
256            $(
257                $(#[$inner:ident $($args:tt)*])*
258                const $Flag:tt;
259            )*
260        }
261    ) => {};
262}