Coverage Report

Created: 2025-07-23 07:29

/rust/registry/src/index.crates.io-6f17d22bba15001f/bitflags-1.2.1/src/lib.rs
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2
// file at the top-level directory of this distribution and at
3
// http://rust-lang.org/COPYRIGHT.
4
//
5
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8
// option. This file may not be copied, modified, or distributed
9
// except according to those terms.
10
11
//! A typesafe bitmask flag generator useful for sets of C-style bitmask flags.
12
//! It can be used for creating typesafe wrappers around C APIs.
13
//!
14
//! The `bitflags!` macro generates a `struct` that manages a set of flags. The
15
//! flags should only be defined for integer types, otherwise unexpected type
16
//! errors may occur at compile time.
17
//!
18
//! # Example
19
//!
20
//! ```
21
//! #[macro_use]
22
//! extern crate bitflags;
23
//!
24
//! bitflags! {
25
//!     struct Flags: u32 {
26
//!         const A = 0b00000001;
27
//!         const B = 0b00000010;
28
//!         const C = 0b00000100;
29
//!         const ABC = Self::A.bits | Self::B.bits | Self::C.bits;
30
//!     }
31
//! }
32
//!
33
//! fn main() {
34
//!     let e1 = Flags::A | Flags::C;
35
//!     let e2 = Flags::B | Flags::C;
36
//!     assert_eq!((e1 | e2), Flags::ABC);   // union
37
//!     assert_eq!((e1 & e2), Flags::C);     // intersection
38
//!     assert_eq!((e1 - e2), Flags::A);     // set difference
39
//!     assert_eq!(!e2, Flags::A);           // set complement
40
//! }
41
//! ```
42
//!
43
//! See [`example_generated::Flags`](./example_generated/struct.Flags.html) for documentation of code
44
//! generated by the above `bitflags!` expansion.
45
//!
46
//! The generated `struct`s can also be extended with type and trait
47
//! implementations:
48
//!
49
//! ```
50
//! #[macro_use]
51
//! extern crate bitflags;
52
//!
53
//! use std::fmt;
54
//!
55
//! bitflags! {
56
//!     struct Flags: u32 {
57
//!         const A = 0b00000001;
58
//!         const B = 0b00000010;
59
//!     }
60
//! }
61
//!
62
//! impl Flags {
63
//!     pub fn clear(&mut self) {
64
//!         self.bits = 0;  // The `bits` field can be accessed from within the
65
//!                         // same module where the `bitflags!` macro was invoked.
66
//!     }
67
//! }
68
//!
69
//! impl fmt::Display for Flags {
70
//!     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
71
//!         write!(f, "hi!")
72
//!     }
73
//! }
74
//!
75
//! fn main() {
76
//!     let mut flags = Flags::A | Flags::B;
77
//!     flags.clear();
78
//!     assert!(flags.is_empty());
79
//!     assert_eq!(format!("{}", flags), "hi!");
80
//!     assert_eq!(format!("{:?}", Flags::A | Flags::B), "A | B");
81
//!     assert_eq!(format!("{:?}", Flags::B), "B");
82
//! }
83
//! ```
84
//!
85
//! # Visibility
86
//!
87
//! The generated struct and its associated flag constants are not exported
88
//! out of the current module by default. A definition can be exported out of
89
//! the current module by adding `pub` before `flags`:
90
//!
91
//! ```
92
//! #[macro_use]
93
//! extern crate bitflags;
94
//!
95
//! mod example {
96
//!     bitflags! {
97
//!         pub struct Flags1: u32 {
98
//!             const A = 0b00000001;
99
//!         }
100
//!     }
101
//!     bitflags! {
102
//! #       pub
103
//!         struct Flags2: u32 {
104
//!             const B = 0b00000010;
105
//!         }
106
//!     }
107
//! }
108
//!
109
//! fn main() {
110
//!     let flag1 = example::Flags1::A;
111
//!     let flag2 = example::Flags2::B; // error: const `B` is private
112
//! }
113
//! ```
114
//!
115
//! # Attributes
116
//!
117
//! Attributes can be attached to the generated `struct` by placing them
118
//! before the `flags` keyword.
119
//!
120
//! # Trait implementations
121
//!
122
//! The `Copy`, `Clone`, `PartialEq`, `Eq`, `PartialOrd`, `Ord` and `Hash`
123
//! traits automatically derived for the `struct` using the `derive` attribute.
124
//! Additional traits can be derived by providing an explicit `derive`
125
//! attribute on `flags`.
126
//!
127
//! The `Extend` and `FromIterator` traits are implemented for the `struct`,
128
//! too: `Extend` adds the union of the instances of the `struct` iterated over,
129
//! while `FromIterator` calculates the union.
130
//!
131
//! The `Binary`, `Debug`, `LowerHex`, `Octal` and `UpperHex` trait is also
132
//! implemented by displaying the bits value of the internal struct.
133
//!
134
//! ## Operators
135
//!
136
//! The following operator traits are implemented for the generated `struct`:
137
//!
138
//! - `BitOr` and `BitOrAssign`: union
139
//! - `BitAnd` and `BitAndAssign`: intersection
140
//! - `BitXor` and `BitXorAssign`: toggle
141
//! - `Sub` and `SubAssign`: set difference
142
//! - `Not`: set complement
143
//!
144
//! # Methods
145
//!
146
//! The following methods are defined for the generated `struct`:
147
//!
148
//! - `empty`: an empty set of flags
149
//! - `all`: the set of all defined flags
150
//! - `bits`: the raw value of the flags currently stored
151
//! - `from_bits`: convert from underlying bit representation, unless that
152
//!                representation contains bits that do not correspond to a
153
//!                defined flag
154
//! - `from_bits_truncate`: convert from underlying bit representation, dropping
155
//!                         any bits that do not correspond to defined flags
156
//! - `from_bits_unchecked`: convert from underlying bit representation, keeping
157
//!                          all bits (even those not corresponding to defined
158
//!                          flags)
159
//! - `is_empty`: `true` if no flags are currently stored
160
//! - `is_all`: `true` if currently set flags exactly equal all defined flags
161
//! - `intersects`: `true` if there are flags common to both `self` and `other`
162
//! - `contains`: `true` all of the flags in `other` are contained within `self`
163
//! - `insert`: inserts the specified flags in-place
164
//! - `remove`: removes the specified flags in-place
165
//! - `toggle`: the specified flags will be inserted if not present, and removed
166
//!             if they are.
167
//! - `set`: inserts or removes the specified flags depending on the passed value
168
//!
169
//! ## Default
170
//!
171
//! The `Default` trait is not automatically implemented for the generated struct.
172
//!
173
//! If your default value is equal to `0` (which is the same value as calling `empty()`
174
//! on the generated struct), you can simply derive `Default`:
175
//!
176
//! ```
177
//! #[macro_use]
178
//! extern crate bitflags;
179
//!
180
//! bitflags! {
181
//!     // Results in default value with bits: 0
182
//!     #[derive(Default)]
183
//!     struct Flags: u32 {
184
//!         const A = 0b00000001;
185
//!         const B = 0b00000010;
186
//!         const C = 0b00000100;
187
//!     }
188
//! }
189
//!
190
//! fn main() {
191
//!     let derived_default: Flags = Default::default();
192
//!     assert_eq!(derived_default.bits(), 0);
193
//! }
194
//! ```
195
//!
196
//! If your default value is not equal to `0` you need to implement `Default` yourself:
197
//!
198
//! ```
199
//! #[macro_use]
200
//! extern crate bitflags;
201
//!
202
//! bitflags! {
203
//!     struct Flags: u32 {
204
//!         const A = 0b00000001;
205
//!         const B = 0b00000010;
206
//!         const C = 0b00000100;
207
//!     }
208
//! }
209
//!
210
//! // explicit `Default` implementation
211
//! impl Default for Flags {
212
//!     fn default() -> Flags {
213
//!         Flags::A | Flags::C
214
//!     }
215
//! }
216
//!
217
//! fn main() {
218
//!     let implemented_default: Flags = Default::default();
219
//!     assert_eq!(implemented_default, (Flags::A | Flags::C));
220
//! }
221
//! ```
222
//!
223
//! # Zero Flags
224
//!
225
//! Flags with a value equal to zero will have some strange behavior that one should be aware of.
226
//!
227
//! ```
228
//! #[macro_use]
229
//! extern crate bitflags;
230
//!
231
//! bitflags! {
232
//!     struct Flags: u32 {
233
//!         const NONE = 0b00000000;
234
//!         const SOME = 0b00000001;
235
//!     }
236
//! }
237
//!
238
//! fn main() {
239
//!     let empty = Flags::empty();
240
//!     let none = Flags::NONE;
241
//!     let some = Flags::SOME;
242
//!
243
//!     // Zero flags are treated as always present
244
//!     assert!(empty.contains(Flags::NONE));
245
//!     assert!(none.contains(Flags::NONE));
246
//!     assert!(some.contains(Flags::NONE));
247
//!
248
//!     // Zero flags will be ignored when testing for emptiness
249
//!     assert!(none.is_empty());
250
//! }
251
//! ```
252
253
#![no_std]
254
#![doc(html_root_url = "https://docs.rs/bitflags/1.2.1")]
255
256
#[cfg(test)]
257
#[macro_use]
258
extern crate std;
259
260
// Re-export libcore using an alias so that the macros can work without
261
// requiring `extern crate core` downstream.
262
#[doc(hidden)]
263
pub extern crate core as _core;
264
265
/// The macro used to generate the flag structure.
266
///
267
/// See the [crate level docs](../bitflags/index.html) for complete documentation.
268
///
269
/// # Example
270
///
271
/// ```
272
/// #[macro_use]
273
/// extern crate bitflags;
274
///
275
/// bitflags! {
276
///     struct Flags: u32 {
277
///         const A = 0b00000001;
278
///         const B = 0b00000010;
279
///         const C = 0b00000100;
280
///         const ABC = Self::A.bits | Self::B.bits | Self::C.bits;
281
///     }
282
/// }
283
///
284
/// fn main() {
285
///     let e1 = Flags::A | Flags::C;
286
///     let e2 = Flags::B | Flags::C;
287
///     assert_eq!((e1 | e2), Flags::ABC);   // union
288
///     assert_eq!((e1 & e2), Flags::C);     // intersection
289
///     assert_eq!((e1 - e2), Flags::A);     // set difference
290
///     assert_eq!(!e2, Flags::A);           // set complement
291
/// }
292
/// ```
293
///
294
/// The generated `struct`s can also be extended with type and trait
295
/// implementations:
296
///
297
/// ```
298
/// #[macro_use]
299
/// extern crate bitflags;
300
///
301
/// use std::fmt;
302
///
303
/// bitflags! {
304
///     struct Flags: u32 {
305
///         const A = 0b00000001;
306
///         const B = 0b00000010;
307
///     }
308
/// }
309
///
310
/// impl Flags {
311
///     pub fn clear(&mut self) {
312
///         self.bits = 0;  // The `bits` field can be accessed from within the
313
///                         // same module where the `bitflags!` macro was invoked.
314
///     }
315
/// }
316
///
317
/// impl fmt::Display for Flags {
318
///     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
319
///         write!(f, "hi!")
320
///     }
321
/// }
322
///
323
/// fn main() {
324
///     let mut flags = Flags::A | Flags::B;
325
///     flags.clear();
326
///     assert!(flags.is_empty());
327
///     assert_eq!(format!("{}", flags), "hi!");
328
///     assert_eq!(format!("{:?}", Flags::A | Flags::B), "A | B");
329
///     assert_eq!(format!("{:?}", Flags::B), "B");
330
/// }
331
/// ```
332
#[macro_export(local_inner_macros)]
333
macro_rules! bitflags {
334
    (
335
        $(#[$outer:meta])*
336
        pub struct $BitFlags:ident: $T:ty {
337
            $(
338
                $(#[$inner:ident $($args:tt)*])*
339
                const $Flag:ident = $value:expr;
340
            )+
341
        }
342
    ) => {
343
        __bitflags! {
344
            $(#[$outer])*
345
            (pub) $BitFlags: $T {
346
                $(
347
                    $(#[$inner $($args)*])*
348
                    $Flag = $value;
349
                )+
350
            }
351
        }
352
    };
353
    (
354
        $(#[$outer:meta])*
355
        struct $BitFlags:ident: $T:ty {
356
            $(
357
                $(#[$inner:ident $($args:tt)*])*
358
                const $Flag:ident = $value:expr;
359
            )+
360
        }
361
    ) => {
362
        __bitflags! {
363
            $(#[$outer])*
364
            () $BitFlags: $T {
365
                $(
366
                    $(#[$inner $($args)*])*
367
                    $Flag = $value;
368
                )+
369
            }
370
        }
371
    };
372
    (
373
        $(#[$outer:meta])*
374
        pub ($($vis:tt)+) struct $BitFlags:ident: $T:ty {
375
            $(
376
                $(#[$inner:ident $($args:tt)*])*
377
                const $Flag:ident = $value:expr;
378
            )+
379
        }
380
    ) => {
381
        __bitflags! {
382
            $(#[$outer])*
383
            (pub ($($vis)+)) $BitFlags: $T {
384
                $(
385
                    $(#[$inner $($args)*])*
386
                    $Flag = $value;
387
                )+
388
            }
389
        }
390
    };
391
}
392
393
#[macro_export(local_inner_macros)]
394
#[doc(hidden)]
395
macro_rules! __bitflags {
396
    (
397
        $(#[$outer:meta])*
398
        ($($vis:tt)*) $BitFlags:ident: $T:ty {
399
            $(
400
                $(#[$inner:ident $($args:tt)*])*
401
                $Flag:ident = $value:expr;
402
            )+
403
        }
404
    ) => {
405
        $(#[$outer])*
406
        #[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash)]
407
        $($vis)* struct $BitFlags {
408
            bits: $T,
409
        }
410
411
        __impl_bitflags! {
412
            $BitFlags: $T {
413
                $(
414
                    $(#[$inner $($args)*])*
415
                    $Flag = $value;
416
                )+
417
            }
418
        }
419
    };
420
}
421
422
#[macro_export(local_inner_macros)]
423
#[doc(hidden)]
424
#[cfg(bitflags_const_fn)]
425
macro_rules! __fn_bitflags {
426
    (
427
        $(# $attr_args:tt)*
428
        const fn $($item:tt)*
429
    ) => {
430
        $(# $attr_args)*
431
        const fn $($item)*
432
    };
433
    (
434
        $(# $attr_args:tt)*
435
        pub const fn $($item:tt)*
436
    ) => {
437
        $(# $attr_args)*
438
        pub const fn $($item)*
439
    };
440
    (
441
        $(# $attr_args:tt)*
442
        pub const unsafe fn $($item:tt)*
443
    ) => {
444
        $(# $attr_args)*
445
        pub const unsafe fn $($item)*
446
    };
447
}
448
449
#[macro_export(local_inner_macros)]
450
#[doc(hidden)]
451
#[cfg(not(bitflags_const_fn))]
452
macro_rules! __fn_bitflags {
453
    (
454
        $(# $attr_args:tt)*
455
        const fn $($item:tt)*
456
    ) => {
457
        $(# $attr_args)*
458
        fn $($item)*
459
    };
460
    (
461
        $(# $attr_args:tt)*
462
        pub const fn $($item:tt)*
463
    ) => {
464
        $(# $attr_args)*
465
        pub fn $($item)*
466
    };
467
    (
468
        $(# $attr_args:tt)*
469
        pub const unsafe fn $($item:tt)*
470
    ) => {
471
        $(# $attr_args)*
472
        pub unsafe fn $($item)*
473
    };
474
}
475
476
#[macro_export(local_inner_macros)]
477
#[doc(hidden)]
478
macro_rules! __impl_bitflags {
479
    (
480
        $BitFlags:ident: $T:ty {
481
            $(
482
                $(#[$attr:ident $($args:tt)*])*
483
                $Flag:ident = $value:expr;
484
            )+
485
        }
486
    ) => {
487
        impl $crate::_core::fmt::Debug for $BitFlags {
488
0
            fn fmt(&self, f: &mut $crate::_core::fmt::Formatter) -> $crate::_core::fmt::Result {
489
                // This convoluted approach is to handle #[cfg]-based flag
490
                // omission correctly. For example it needs to support:
491
                //
492
                //    #[cfg(unix)] const A: Flag = /* ... */;
493
                //    #[cfg(windows)] const B: Flag = /* ... */;
494
495
                // Unconditionally define a check for every flag, even disabled
496
                // ones.
497
                #[allow(non_snake_case)]
498
                trait __BitFlags {
499
                    $(
500
                        #[inline]
501
0
                        fn $Flag(&self) -> bool { false }
Unexecuted instantiation: <_ as <suricata::dns::dns::DNSNameFlags as core::fmt::Debug>::fmt::__BitFlags>::INFINITE_LOOP
Unexecuted instantiation: <_ as <suricata::dns::dns::DNSNameFlags as core::fmt::Debug>::fmt::__BitFlags>::TRUNCATED
Unexecuted instantiation: <_ as <suricata::dns::dns::DNSNameFlags as core::fmt::Debug>::fmt::__BitFlags>::LABEL_LIMIT
Unexecuted instantiation: <_ as <suricata::rdp::parser::NegotiationRequestFlags as core::fmt::Debug>::fmt::__BitFlags>::RESTRICTED_ADMIN_MODE_REQUIRED
Unexecuted instantiation: <_ as <suricata::rdp::parser::NegotiationRequestFlags as core::fmt::Debug>::fmt::__BitFlags>::REDIRECTED_AUTHENTICATION_MODE_REQUIRED
Unexecuted instantiation: <_ as <suricata::rdp::parser::NegotiationRequestFlags as core::fmt::Debug>::fmt::__BitFlags>::CORRELATION_INFO_PRESENT
Unexecuted instantiation: <_ as <suricata::rdp::parser::ProtocolFlags as core::fmt::Debug>::fmt::__BitFlags>::PROTOCOL_SSL
Unexecuted instantiation: <_ as <suricata::rdp::parser::ProtocolFlags as core::fmt::Debug>::fmt::__BitFlags>::PROTOCOL_HYBRID
Unexecuted instantiation: <_ as <suricata::rdp::parser::ProtocolFlags as core::fmt::Debug>::fmt::__BitFlags>::PROTOCOL_RDSTLS
Unexecuted instantiation: <_ as <suricata::rdp::parser::ProtocolFlags as core::fmt::Debug>::fmt::__BitFlags>::PROTOCOL_HYBRID_EX
Unexecuted instantiation: <_ as <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Debug>::fmt::__BitFlags>::EXTENDED_CLIENT_DATA_SUPPORTED
Unexecuted instantiation: <_ as <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Debug>::fmt::__BitFlags>::DYNVC_GFX_PROTOCOL_SUPPORTED
Unexecuted instantiation: <_ as <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Debug>::fmt::__BitFlags>::NEGRSP_FLAG_RESERVED
Unexecuted instantiation: <_ as <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Debug>::fmt::__BitFlags>::RESTRICTED_ADMIN_MODE_SUPPORTED
Unexecuted instantiation: <_ as <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Debug>::fmt::__BitFlags>::REDIRECTED_AUTHENTICATION_MODE_SUPPORTED
Unexecuted instantiation: <_ as <suricata::rdp::parser::SupportedColorDepth as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_24_BPP_SUPPORT
Unexecuted instantiation: <_ as <suricata::rdp::parser::SupportedColorDepth as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_16_BPP_SUPPORT
Unexecuted instantiation: <_ as <suricata::rdp::parser::SupportedColorDepth as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_15_BPP_SUPPORT
Unexecuted instantiation: <_ as <suricata::rdp::parser::SupportedColorDepth as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_32_BPP_SUPPORT
Unexecuted instantiation: <_ as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_ERRINFO_PDF
Unexecuted instantiation: <_ as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_WANT_32BPP_SESSION
Unexecuted instantiation: <_ as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_STATUSINFO_PDU
Unexecuted instantiation: <_ as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_STRONG_ASYMMETRIC_KEYS
Unexecuted instantiation: <_ as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_UNUSED
Unexecuted instantiation: <_ as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_VALID_CONNECTION_TYPE
Unexecuted instantiation: <_ as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_MONITOR_LAYOUT_PDU
Unexecuted instantiation: <_ as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_NETCHAR_AUTODETECT
Unexecuted instantiation: <_ as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_DYNVC_GFX_PROTOCOL
Unexecuted instantiation: <_ as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_DYNAMIC_TIME_ZONE
Unexecuted instantiation: <_ as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_HEARTBEAT_PDU
502
                    )+
503
                }
504
505
                // Conditionally override the check for just those flags that
506
                // are not #[cfg]ed away.
507
                impl __BitFlags for $BitFlags {
508
                    $(
509
                        __impl_bitflags! {
510
                            #[allow(deprecated)]
511
                            #[inline]
512
                            $(? #[$attr $($args)*])*
513
0
                            fn $Flag(&self) -> bool {
514
0
                                if Self::$Flag.bits == 0 && self.bits != 0 {
515
0
                                    false
516
                                } else {
517
0
                                    self.bits & Self::$Flag.bits == Self::$Flag.bits
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as <suricata::dns::dns::DNSNameFlags as core::fmt::Debug>::fmt::__BitFlags>::INFINITE_LOOP
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as <suricata::dns::dns::DNSNameFlags as core::fmt::Debug>::fmt::__BitFlags>::TRUNCATED
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as <suricata::dns::dns::DNSNameFlags as core::fmt::Debug>::fmt::__BitFlags>::LABEL_LIMIT
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as <suricata::rdp::parser::NegotiationRequestFlags as core::fmt::Debug>::fmt::__BitFlags>::RESTRICTED_ADMIN_MODE_REQUIRED
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as <suricata::rdp::parser::NegotiationRequestFlags as core::fmt::Debug>::fmt::__BitFlags>::REDIRECTED_AUTHENTICATION_MODE_REQUIRED
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as <suricata::rdp::parser::NegotiationRequestFlags as core::fmt::Debug>::fmt::__BitFlags>::CORRELATION_INFO_PRESENT
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as <suricata::rdp::parser::ProtocolFlags as core::fmt::Debug>::fmt::__BitFlags>::PROTOCOL_SSL
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as <suricata::rdp::parser::ProtocolFlags as core::fmt::Debug>::fmt::__BitFlags>::PROTOCOL_HYBRID
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as <suricata::rdp::parser::ProtocolFlags as core::fmt::Debug>::fmt::__BitFlags>::PROTOCOL_RDSTLS
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as <suricata::rdp::parser::ProtocolFlags as core::fmt::Debug>::fmt::__BitFlags>::PROTOCOL_HYBRID_EX
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Debug>::fmt::__BitFlags>::EXTENDED_CLIENT_DATA_SUPPORTED
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Debug>::fmt::__BitFlags>::DYNVC_GFX_PROTOCOL_SUPPORTED
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Debug>::fmt::__BitFlags>::NEGRSP_FLAG_RESERVED
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Debug>::fmt::__BitFlags>::RESTRICTED_ADMIN_MODE_SUPPORTED
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Debug>::fmt::__BitFlags>::REDIRECTED_AUTHENTICATION_MODE_SUPPORTED
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as <suricata::rdp::parser::SupportedColorDepth as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_24_BPP_SUPPORT
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as <suricata::rdp::parser::SupportedColorDepth as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_16_BPP_SUPPORT
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as <suricata::rdp::parser::SupportedColorDepth as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_15_BPP_SUPPORT
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as <suricata::rdp::parser::SupportedColorDepth as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_32_BPP_SUPPORT
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_ERRINFO_PDF
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_WANT_32BPP_SESSION
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_STATUSINFO_PDU
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_STRONG_ASYMMETRIC_KEYS
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_UNUSED
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_VALID_CONNECTION_TYPE
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_MONITOR_LAYOUT_PDU
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_NETCHAR_AUTODETECT
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_DYNVC_GFX_PROTOCOL
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_DYNAMIC_TIME_ZONE
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt::__BitFlags>::RNS_UD_CS_SUPPORT_HEARTBEAT_PDU
518
                                }
519
                            }
520
                        }
521
                    )+
522
                }
523
524
0
                let mut first = true;
525
                $(
526
0
                    if <$BitFlags as __BitFlags>::$Flag(self) {
527
0
                        if !first {
528
0
                            f.write_str(" | ")?;
529
0
                        }
530
0
                        first = false;
531
0
                        f.write_str(__bitflags_stringify!($Flag))?;
532
0
                    }
533
0
                )+
534
0
                let extra_bits = self.bits & !$BitFlags::all().bits();
535
0
                if extra_bits != 0 {
536
0
                    if !first {
537
0
                        f.write_str(" | ")?;
538
0
                    }
539
0
                    first = false;
540
0
                    f.write_str("0x")?;
541
0
                    $crate::_core::fmt::LowerHex::fmt(&extra_bits, f)?;
542
0
                }
543
0
                if first {
544
0
                    f.write_str("(empty)")?;
545
0
                }
546
0
                Ok(())
547
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::fmt::Debug>::fmt
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::fmt::Debug>::fmt
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::fmt::Debug>::fmt
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Debug>::fmt
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::fmt::Debug>::fmt
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Debug>::fmt
548
0
        }
549
0
        impl $crate::_core::fmt::Binary for $BitFlags {
550
0
            fn fmt(&self, f: &mut $crate::_core::fmt::Formatter) -> $crate::_core::fmt::Result {
551
0
                $crate::_core::fmt::Binary::fmt(&self.bits, f)
552
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::fmt::Binary>::fmt
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::fmt::Binary>::fmt
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::fmt::Binary>::fmt
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Binary>::fmt
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::fmt::Binary>::fmt
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Binary>::fmt
553
        }
554
        impl $crate::_core::fmt::Octal for $BitFlags {
555
0
            fn fmt(&self, f: &mut $crate::_core::fmt::Formatter) -> $crate::_core::fmt::Result {
556
0
                $crate::_core::fmt::Octal::fmt(&self.bits, f)
557
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::fmt::Octal>::fmt
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::fmt::Octal>::fmt
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::fmt::Octal>::fmt
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::Octal>::fmt
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::fmt::Octal>::fmt
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::Octal>::fmt
558
        }
559
        impl $crate::_core::fmt::LowerHex for $BitFlags {
560
0
            fn fmt(&self, f: &mut $crate::_core::fmt::Formatter) -> $crate::_core::fmt::Result {
561
0
                $crate::_core::fmt::LowerHex::fmt(&self.bits, f)
562
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::fmt::LowerHex>::fmt
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::fmt::LowerHex>::fmt
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::fmt::LowerHex>::fmt
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::LowerHex>::fmt
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::fmt::LowerHex>::fmt
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::LowerHex>::fmt
563
        }
564
        impl $crate::_core::fmt::UpperHex for $BitFlags {
565
0
            fn fmt(&self, f: &mut $crate::_core::fmt::Formatter) -> $crate::_core::fmt::Result {
566
0
                $crate::_core::fmt::UpperHex::fmt(&self.bits, f)
567
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::fmt::UpperHex>::fmt
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::fmt::UpperHex>::fmt
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::fmt::UpperHex>::fmt
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::fmt::UpperHex>::fmt
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::fmt::UpperHex>::fmt
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::fmt::UpperHex>::fmt
568
        }
569
570
        #[allow(dead_code)]
571
        impl $BitFlags {
572
            $(
573
                $(#[$attr $($args)*])*
574
                pub const $Flag: $BitFlags = $BitFlags { bits: $value };
575
            )+
576
577
            __fn_bitflags! {
578
                /// Returns an empty set of flags
579
                #[inline]
580
0
                pub const fn empty() -> $BitFlags {
581
0
                    $BitFlags { bits: 0 }
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags>::empty
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags>::empty
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags>::empty
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::empty
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags>::empty
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth>::empty
582
                }
583
            }
584
585
            __fn_bitflags! {
586
                /// Returns the set containing all flags.
587
                #[inline]
588
23.0k
                pub const fn all() -> $BitFlags {
589
23.0k
                    // See `Debug::fmt` for why this approach is taken.
590
23.0k
                    #[allow(non_snake_case)]
591
23.0k
                    trait __BitFlags {
592
23.0k
                        $(
593
23.0k
                            const $Flag: $T = 0;
594
23.0k
                        )+
595
23.0k
                    }
596
23.0k
                    impl __BitFlags for $BitFlags {
597
23.0k
                        $(
598
23.0k
                            __impl_bitflags! {
599
23.0k
                                #[allow(deprecated)]
600
23.0k
                                $(? #[$attr $($args)*])*
601
23.0k
                                const $Flag: $T = Self::$Flag.bits;
602
23.0k
                            }
603
23.0k
                        )+
604
23.0k
                    }
605
23.0k
                    $BitFlags { bits: $(<$BitFlags as __BitFlags>::$Flag)|+ }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::all
<suricata::rdp::parser::NegotiationRequestFlags>::all
Line
Count
Source
588
1.53k
                pub const fn all() -> $BitFlags {
589
1.53k
                    // See `Debug::fmt` for why this approach is taken.
590
1.53k
                    #[allow(non_snake_case)]
591
1.53k
                    trait __BitFlags {
592
1.53k
                        $(
593
1.53k
                            const $Flag: $T = 0;
594
1.53k
                        )+
595
1.53k
                    }
596
1.53k
                    impl __BitFlags for $BitFlags {
597
1.53k
                        $(
598
1.53k
                            __impl_bitflags! {
599
1.53k
                                #[allow(deprecated)]
600
1.53k
                                $(? #[$attr $($args)*])*
601
1.53k
                                const $Flag: $T = Self::$Flag.bits;
602
1.53k
                            }
603
1.53k
                        )+
604
1.53k
                    }
605
1.53k
                    $BitFlags { bits: $(<$BitFlags as __BitFlags>::$Flag)|+ }
<suricata::rdp::parser::NegotiationResponseFlags>::all
Line
Count
Source
588
2.59k
                pub const fn all() -> $BitFlags {
589
2.59k
                    // See `Debug::fmt` for why this approach is taken.
590
2.59k
                    #[allow(non_snake_case)]
591
2.59k
                    trait __BitFlags {
592
2.59k
                        $(
593
2.59k
                            const $Flag: $T = 0;
594
2.59k
                        )+
595
2.59k
                    }
596
2.59k
                    impl __BitFlags for $BitFlags {
597
2.59k
                        $(
598
2.59k
                            __impl_bitflags! {
599
2.59k
                                #[allow(deprecated)]
600
2.59k
                                $(? #[$attr $($args)*])*
601
2.59k
                                const $Flag: $T = Self::$Flag.bits;
602
2.59k
                            }
603
2.59k
                        )+
604
2.59k
                    }
605
2.59k
                    $BitFlags { bits: $(<$BitFlags as __BitFlags>::$Flag)|+ }
<suricata::rdp::parser::ProtocolFlags>::all
Line
Count
Source
588
4.63k
                pub const fn all() -> $BitFlags {
589
4.63k
                    // See `Debug::fmt` for why this approach is taken.
590
4.63k
                    #[allow(non_snake_case)]
591
4.63k
                    trait __BitFlags {
592
4.63k
                        $(
593
4.63k
                            const $Flag: $T = 0;
594
4.63k
                        )+
595
4.63k
                    }
596
4.63k
                    impl __BitFlags for $BitFlags {
597
4.63k
                        $(
598
4.63k
                            __impl_bitflags! {
599
4.63k
                                #[allow(deprecated)]
600
4.63k
                                $(? #[$attr $($args)*])*
601
4.63k
                                const $Flag: $T = Self::$Flag.bits;
602
4.63k
                            }
603
4.63k
                        )+
604
4.63k
                    }
605
4.63k
                    $BitFlags { bits: $(<$BitFlags as __BitFlags>::$Flag)|+ }
<suricata::rdp::parser::SupportedColorDepth>::all
Line
Count
Source
588
7.40k
                pub const fn all() -> $BitFlags {
589
7.40k
                    // See `Debug::fmt` for why this approach is taken.
590
7.40k
                    #[allow(non_snake_case)]
591
7.40k
                    trait __BitFlags {
592
7.40k
                        $(
593
7.40k
                            const $Flag: $T = 0;
594
7.40k
                        )+
595
7.40k
                    }
596
7.40k
                    impl __BitFlags for $BitFlags {
597
7.40k
                        $(
598
7.40k
                            __impl_bitflags! {
599
7.40k
                                #[allow(deprecated)]
600
7.40k
                                $(? #[$attr $($args)*])*
601
7.40k
                                const $Flag: $T = Self::$Flag.bits;
602
7.40k
                            }
603
7.40k
                        )+
604
7.40k
                    }
605
7.40k
                    $BitFlags { bits: $(<$BitFlags as __BitFlags>::$Flag)|+ }
<suricata::rdp::parser::EarlyCapabilityFlags>::all
Line
Count
Source
588
6.91k
                pub const fn all() -> $BitFlags {
589
6.91k
                    // See `Debug::fmt` for why this approach is taken.
590
6.91k
                    #[allow(non_snake_case)]
591
6.91k
                    trait __BitFlags {
592
6.91k
                        $(
593
6.91k
                            const $Flag: $T = 0;
594
6.91k
                        )+
595
6.91k
                    }
596
6.91k
                    impl __BitFlags for $BitFlags {
597
6.91k
                        $(
598
6.91k
                            __impl_bitflags! {
599
6.91k
                                #[allow(deprecated)]
600
6.91k
                                $(? #[$attr $($args)*])*
601
6.91k
                                const $Flag: $T = Self::$Flag.bits;
602
6.91k
                            }
603
6.91k
                        )+
604
6.91k
                    }
605
6.91k
                    $BitFlags { bits: $(<$BitFlags as __BitFlags>::$Flag)|+ }
606
                }
607
            }
608
609
            __fn_bitflags! {
610
                /// Returns the raw value of the flags currently stored.
611
                #[inline]
612
23.0k
                pub const fn bits(&self) -> $T {
613
23.0k
                    self.bits
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::bits
<suricata::rdp::parser::NegotiationRequestFlags>::bits
Line
Count
Source
612
1.53k
                pub const fn bits(&self) -> $T {
613
1.53k
                    self.bits
<suricata::rdp::parser::NegotiationResponseFlags>::bits
Line
Count
Source
612
2.59k
                pub const fn bits(&self) -> $T {
613
2.59k
                    self.bits
<suricata::rdp::parser::ProtocolFlags>::bits
Line
Count
Source
612
4.63k
                pub const fn bits(&self) -> $T {
613
4.63k
                    self.bits
<suricata::rdp::parser::SupportedColorDepth>::bits
Line
Count
Source
612
7.40k
                pub const fn bits(&self) -> $T {
613
7.40k
                    self.bits
<suricata::rdp::parser::EarlyCapabilityFlags>::bits
Line
Count
Source
612
6.91k
                pub const fn bits(&self) -> $T {
613
6.91k
                    self.bits
614
                }
615
            }
616
617
            /// Convert from underlying bit representation, unless that
618
            /// representation contains bits that do not correspond to a flag.
619
            #[inline]
620
23.0k
            pub fn from_bits(bits: $T) -> $crate::_core::option::Option<$BitFlags> {
621
23.0k
                if (bits & !$BitFlags::all().bits()) == 0 {
622
20.7k
                    $crate::_core::option::Option::Some($BitFlags { bits })
623
                } else {
624
2.34k
                    $crate::_core::option::Option::None
625
                }
626
23.0k
            }
<suricata::rdp::parser::SupportedColorDepth>::from_bits
Line
Count
Source
620
7.40k
            pub fn from_bits(bits: $T) -> $crate::_core::option::Option<$BitFlags> {
621
7.40k
                if (bits & !$BitFlags::all().bits()) == 0 {
622
7.10k
                    $crate::_core::option::Option::Some($BitFlags { bits })
623
                } else {
624
299
                    $crate::_core::option::Option::None
625
                }
626
            }
<suricata::rdp::parser::EarlyCapabilityFlags>::from_bits
Line
Count
Source
620
6.91k
            pub fn from_bits(bits: $T) -> $crate::_core::option::Option<$BitFlags> {
621
6.91k
                if (bits & !$BitFlags::all().bits()) == 0 {
622
6.45k
                    $crate::_core::option::Option::Some($BitFlags { bits })
623
                } else {
624
457
                    $crate::_core::option::Option::None
625
                }
626
            }
<suricata::rdp::parser::NegotiationRequestFlags>::from_bits
Line
Count
Source
620
1.53k
            pub fn from_bits(bits: $T) -> $crate::_core::option::Option<$BitFlags> {
621
1.53k
                if (bits & !$BitFlags::all().bits()) == 0 {
622
1.31k
                    $crate::_core::option::Option::Some($BitFlags { bits })
623
                } else {
624
220
                    $crate::_core::option::Option::None
625
                }
626
            }
<suricata::rdp::parser::NegotiationResponseFlags>::from_bits
Line
Count
Source
620
2.59k
            pub fn from_bits(bits: $T) -> $crate::_core::option::Option<$BitFlags> {
621
2.59k
                if (bits & !$BitFlags::all().bits()) == 0 {
622
2.37k
                    $crate::_core::option::Option::Some($BitFlags { bits })
623
                } else {
624
220
                    $crate::_core::option::Option::None
625
                }
626
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::from_bits
<suricata::rdp::parser::ProtocolFlags>::from_bits
Line
Count
Source
620
4.63k
            pub fn from_bits(bits: $T) -> $crate::_core::option::Option<$BitFlags> {
621
4.63k
                if (bits & !$BitFlags::all().bits()) == 0 {
622
3.48k
                    $crate::_core::option::Option::Some($BitFlags { bits })
623
                } else {
624
1.15k
                    $crate::_core::option::Option::None
625
                }
626
            }
627
23.0k
628
23.0k
            __fn_bitflags! {
629
23.0k
                /// Convert from underlying bit representation, dropping any bits
630
23.0k
                /// that do not correspond to flags.
631
23.0k
                #[inline]
632
23.0k
                pub const fn from_bits_truncate(bits: $T) -> $BitFlags {
633
0
                    $BitFlags { bits: bits & $BitFlags::all().bits }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::from_bits_truncate
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags>::from_bits_truncate
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags>::from_bits_truncate
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags>::from_bits_truncate
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth>::from_bits_truncate
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags>::from_bits_truncate
634
                }
635
            }
636
637
            __fn_bitflags! {
638
                /// Convert from underlying bit representation, preserving all
639
                /// bits (even those not corresponding to a defined flag).
640
                #[inline]
641
0
                pub const unsafe fn from_bits_unchecked(bits: $T) -> $BitFlags {
642
0
                    $BitFlags { bits }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::from_bits_unchecked
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags>::from_bits_unchecked
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags>::from_bits_unchecked
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags>::from_bits_unchecked
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth>::from_bits_unchecked
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags>::from_bits_unchecked
643
                }
644
            }
645
646
            __fn_bitflags! {
647
                /// Returns `true` if no flags are currently stored.
648
                #[inline]
649
0
                pub const fn is_empty(&self) -> bool {
650
0
                    self.bits() == $BitFlags::empty().bits()
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags>::is_empty
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags>::is_empty
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags>::is_empty
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::is_empty
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags>::is_empty
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth>::is_empty
651
                }
652
            }
653
654
            __fn_bitflags! {
655
                /// Returns `true` if all flags are currently set.
656
                #[inline]
657
0
                pub const fn is_all(&self) -> bool {
658
0
                    self.bits == $BitFlags::all().bits
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::is_all
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags>::is_all
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags>::is_all
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags>::is_all
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth>::is_all
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags>::is_all
659
                }
660
            }
661
662
            __fn_bitflags! {
663
                /// Returns `true` if there are flags common to both `self` and `other`.
664
                #[inline]
665
0
                pub const fn intersects(&self, other: $BitFlags) -> bool {
666
0
                    !$BitFlags{ bits: self.bits & other.bits}.is_empty()
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::intersects
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags>::intersects
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags>::intersects
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags>::intersects
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth>::intersects
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags>::intersects
667
                }
668
            }
669
670
            __fn_bitflags! {
671
                /// Returns `true` all of the flags in `other` are contained within `self`.
672
                #[inline]
673
12.9M
                pub const fn contains(&self, other: $BitFlags) -> bool {
674
12.9M
                    (self.bits & other.bits) == other.bits
<suricata::dns::dns::DNSNameFlags>::contains
Line
Count
Source
673
12.9M
                pub const fn contains(&self, other: $BitFlags) -> bool {
674
12.9M
                    (self.bits & other.bits) == other.bits
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags>::contains
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags>::contains
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags>::contains
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags>::contains
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth>::contains
675
                }
676
            }
677
678
            /// Inserts the specified flags in-place.
679
            #[inline]
680
2.83M
            pub fn insert(&mut self, other: $BitFlags) {
681
2.83M
                self.bits |= other.bits;
682
2.83M
            }
<suricata::dns::dns::DNSNameFlags>::insert
Line
Count
Source
680
2.83M
            pub fn insert(&mut self, other: $BitFlags) {
681
2.83M
                self.bits |= other.bits;
682
2.83M
            }
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags>::insert
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags>::insert
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags>::insert
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth>::insert
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags>::insert
683
684
            /// Removes the specified flags in-place.
685
            #[inline]
686
0
            pub fn remove(&mut self, other: $BitFlags) {
687
0
                self.bits &= !other.bits;
688
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::remove
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags>::remove
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags>::remove
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags>::remove
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth>::remove
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags>::remove
689
690
            /// Toggles the specified flags in-place.
691
            #[inline]
692
0
            pub fn toggle(&mut self, other: $BitFlags) {
693
0
                self.bits ^= other.bits;
694
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::toggle
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags>::toggle
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags>::toggle
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags>::toggle
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth>::toggle
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags>::toggle
695
696
            /// Inserts or removes the specified flags depending on the passed value.
697
            #[inline]
698
0
            pub fn set(&mut self, other: $BitFlags, value: bool) {
699
0
                if value {
700
0
                    self.insert(other);
701
0
                } else {
702
0
                    self.remove(other);
703
0
                }
704
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags>::set
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags>::set
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags>::set
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags>::set
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth>::set
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags>::set
705
0
        }
706
0
707
0
        impl $crate::_core::ops::BitOr for $BitFlags {
708
0
            type Output = $BitFlags;
709
0
710
0
            /// Returns the union of the two sets of flags.
711
0
            #[inline]
712
0
            fn bitor(self, other: $BitFlags) -> $BitFlags {
713
0
                $BitFlags { bits: self.bits | other.bits }
714
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::ops::bit::BitOr>::bitor
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::ops::bit::BitOr>::bitor
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::ops::bit::BitOr>::bitor
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::ops::bit::BitOr>::bitor
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::ops::bit::BitOr>::bitor
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::ops::bit::BitOr>::bitor
715
        }
716
717
        impl $crate::_core::ops::BitOrAssign for $BitFlags {
718
719
            /// Adds the set of flags.
720
            #[inline]
721
0
            fn bitor_assign(&mut self, other: $BitFlags) {
722
0
                self.bits |= other.bits;
723
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::ops::bit::BitOrAssign>::bitor_assign
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::ops::bit::BitOrAssign>::bitor_assign
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::ops::bit::BitOrAssign>::bitor_assign
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::ops::bit::BitOrAssign>::bitor_assign
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::ops::bit::BitOrAssign>::bitor_assign
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::ops::bit::BitOrAssign>::bitor_assign
724
        }
725
726
        impl $crate::_core::ops::BitXor for $BitFlags {
727
            type Output = $BitFlags;
728
729
            /// Returns the left flags, but with all the right flags toggled.
730
            #[inline]
731
0
            fn bitxor(self, other: $BitFlags) -> $BitFlags {
732
0
                $BitFlags { bits: self.bits ^ other.bits }
733
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::ops::bit::BitXor>::bitxor
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::ops::bit::BitXor>::bitxor
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::ops::bit::BitXor>::bitxor
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::ops::bit::BitXor>::bitxor
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::ops::bit::BitXor>::bitxor
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::ops::bit::BitXor>::bitxor
734
        }
735
736
        impl $crate::_core::ops::BitXorAssign for $BitFlags {
737
738
            /// Toggles the set of flags.
739
            #[inline]
740
0
            fn bitxor_assign(&mut self, other: $BitFlags) {
741
0
                self.bits ^= other.bits;
742
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::ops::bit::BitXorAssign>::bitxor_assign
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::ops::bit::BitXorAssign>::bitxor_assign
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::ops::bit::BitXorAssign>::bitxor_assign
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::ops::bit::BitXorAssign>::bitxor_assign
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::ops::bit::BitXorAssign>::bitxor_assign
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::ops::bit::BitXorAssign>::bitxor_assign
743
        }
744
745
        impl $crate::_core::ops::BitAnd for $BitFlags {
746
            type Output = $BitFlags;
747
748
            /// Returns the intersection between the two sets of flags.
749
            #[inline]
750
0
            fn bitand(self, other: $BitFlags) -> $BitFlags {
751
0
                $BitFlags { bits: self.bits & other.bits }
752
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::ops::bit::BitAnd>::bitand
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::ops::bit::BitAnd>::bitand
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::ops::bit::BitAnd>::bitand
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::ops::bit::BitAnd>::bitand
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::ops::bit::BitAnd>::bitand
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::ops::bit::BitAnd>::bitand
753
        }
754
755
        impl $crate::_core::ops::BitAndAssign for $BitFlags {
756
757
            /// Disables all flags disabled in the set.
758
            #[inline]
759
0
            fn bitand_assign(&mut self, other: $BitFlags) {
760
0
                self.bits &= other.bits;
761
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::ops::bit::BitAndAssign>::bitand_assign
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::ops::bit::BitAndAssign>::bitand_assign
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::ops::bit::BitAndAssign>::bitand_assign
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::ops::bit::BitAndAssign>::bitand_assign
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::ops::bit::BitAndAssign>::bitand_assign
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::ops::bit::BitAndAssign>::bitand_assign
762
        }
763
764
        impl $crate::_core::ops::Sub for $BitFlags {
765
            type Output = $BitFlags;
766
767
            /// Returns the set difference of the two sets of flags.
768
            #[inline]
769
0
            fn sub(self, other: $BitFlags) -> $BitFlags {
770
0
                $BitFlags { bits: self.bits & !other.bits }
771
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::ops::arith::Sub>::sub
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::ops::arith::Sub>::sub
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::ops::arith::Sub>::sub
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::ops::arith::Sub>::sub
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::ops::arith::Sub>::sub
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::ops::arith::Sub>::sub
772
        }
773
774
        impl $crate::_core::ops::SubAssign for $BitFlags {
775
776
            /// Disables all flags enabled in the set.
777
            #[inline]
778
0
            fn sub_assign(&mut self, other: $BitFlags) {
779
0
                self.bits &= !other.bits;
780
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::ops::arith::SubAssign>::sub_assign
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::ops::arith::SubAssign>::sub_assign
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::ops::arith::SubAssign>::sub_assign
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::ops::arith::SubAssign>::sub_assign
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::ops::arith::SubAssign>::sub_assign
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::ops::arith::SubAssign>::sub_assign
781
        }
782
783
        impl $crate::_core::ops::Not for $BitFlags {
784
            type Output = $BitFlags;
785
786
            /// Returns the complement of this set of flags.
787
            #[inline]
788
0
            fn not(self) -> $BitFlags {
789
0
                $BitFlags { bits: !self.bits } & $BitFlags::all()
790
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::ops::bit::Not>::not
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::ops::bit::Not>::not
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::ops::bit::Not>::not
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::ops::bit::Not>::not
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::ops::bit::Not>::not
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::ops::bit::Not>::not
791
        }
792
793
        impl $crate::_core::iter::Extend<$BitFlags> for $BitFlags {
794
0
            fn extend<T: $crate::_core::iter::IntoIterator<Item=$BitFlags>>(&mut self, iterator: T) {
795
0
                for item in iterator {
796
0
                    self.insert(item)
797
                }
798
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::iter::traits::collect::Extend<suricata::dns::dns::DNSNameFlags>>::extend::<_>
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::iter::traits::collect::Extend<suricata::rdp::parser::NegotiationRequestFlags>>::extend::<_>
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::iter::traits::collect::Extend<suricata::rdp::parser::ProtocolFlags>>::extend::<_>
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::iter::traits::collect::Extend<suricata::rdp::parser::NegotiationResponseFlags>>::extend::<_>
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::iter::traits::collect::Extend<suricata::rdp::parser::SupportedColorDepth>>::extend::<_>
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::iter::traits::collect::Extend<suricata::rdp::parser::EarlyCapabilityFlags>>::extend::<_>
799
0
        }
800
0
801
0
        impl $crate::_core::iter::FromIterator<$BitFlags> for $BitFlags {
802
0
            fn from_iter<T: $crate::_core::iter::IntoIterator<Item=$BitFlags>>(iterator: T) -> $BitFlags {
803
0
                let mut result = Self::empty();
804
0
                result.extend(iterator);
805
0
                result
806
0
            }
Unexecuted instantiation: <suricata::dns::dns::DNSNameFlags as core::iter::traits::collect::FromIterator<suricata::dns::dns::DNSNameFlags>>::from_iter::<_>
Unexecuted instantiation: <suricata::rdp::parser::NegotiationRequestFlags as core::iter::traits::collect::FromIterator<suricata::rdp::parser::NegotiationRequestFlags>>::from_iter::<_>
Unexecuted instantiation: <suricata::rdp::parser::ProtocolFlags as core::iter::traits::collect::FromIterator<suricata::rdp::parser::ProtocolFlags>>::from_iter::<_>
Unexecuted instantiation: <suricata::rdp::parser::NegotiationResponseFlags as core::iter::traits::collect::FromIterator<suricata::rdp::parser::NegotiationResponseFlags>>::from_iter::<_>
Unexecuted instantiation: <suricata::rdp::parser::SupportedColorDepth as core::iter::traits::collect::FromIterator<suricata::rdp::parser::SupportedColorDepth>>::from_iter::<_>
Unexecuted instantiation: <suricata::rdp::parser::EarlyCapabilityFlags as core::iter::traits::collect::FromIterator<suricata::rdp::parser::EarlyCapabilityFlags>>::from_iter::<_>
807
        }
808
    };
809
810
    // Every attribute that the user writes on a const is applied to the
811
    // corresponding const that we generate, but within the implementation of
812
    // Debug and all() we want to ignore everything but #[cfg] attributes. In
813
    // particular, including a #[deprecated] attribute on those items would fail
814
    // to compile.
815
    // https://github.com/bitflags/bitflags/issues/109
816
    //
817
    // Input:
818
    //
819
    //     ? #[cfg(feature = "advanced")]
820
    //     ? #[deprecated(note = "Use somthing else.")]
821
    //     ? #[doc = r"High quality documentation."]
822
    //     fn f() -> i32 { /* ... */ }
823
    //
824
    // Output:
825
    //
826
    //     #[cfg(feature = "advanced")]
827
    //     fn f() -> i32 { /* ... */ }
828
    (
829
        $(#[$filtered:meta])*
830
        ? #[cfg $($cfgargs:tt)*]
831
        $(? #[$rest:ident $($restargs:tt)*])*
832
        fn $($item:tt)*
833
    ) => {
834
        __impl_bitflags! {
835
            $(#[$filtered])*
836
            #[cfg $($cfgargs)*]
837
            $(? #[$rest $($restargs)*])*
838
            fn $($item)*
839
        }
840
    };
841
    (
842
        $(#[$filtered:meta])*
843
        // $next != `cfg`
844
        ? #[$next:ident $($nextargs:tt)*]
845
        $(? #[$rest:ident $($restargs:tt)*])*
846
        fn $($item:tt)*
847
    ) => {
848
        __impl_bitflags! {
849
            $(#[$filtered])*
850
            // $next filtered out
851
            $(? #[$rest $($restargs)*])*
852
            fn $($item)*
853
        }
854
    };
855
    (
856
        $(#[$filtered:meta])*
857
        fn $($item:tt)*
858
    ) => {
859
        $(#[$filtered])*
860
        fn $($item)*
861
    };
862
863
    // Every attribute that the user writes on a const is applied to the
864
    // corresponding const that we generate, but within the implementation of
865
    // Debug and all() we want to ignore everything but #[cfg] attributes. In
866
    // particular, including a #[deprecated] attribute on those items would fail
867
    // to compile.
868
    // https://github.com/bitflags/bitflags/issues/109
869
    //
870
    // const version
871
    //
872
    // Input:
873
    //
874
    //     ? #[cfg(feature = "advanced")]
875
    //     ? #[deprecated(note = "Use somthing else.")]
876
    //     ? #[doc = r"High quality documentation."]
877
    //     const f: i32 { /* ... */ }
878
    //
879
    // Output:
880
    //
881
    //     #[cfg(feature = "advanced")]
882
    //     const f: i32 { /* ... */ }
883
    (
884
        $(#[$filtered:meta])*
885
        ? #[cfg $($cfgargs:tt)*]
886
        $(? #[$rest:ident $($restargs:tt)*])*
887
        const $($item:tt)*
888
    ) => {
889
        __impl_bitflags! {
890
            $(#[$filtered])*
891
            #[cfg $($cfgargs)*]
892
            $(? #[$rest $($restargs)*])*
893
            const $($item)*
894
        }
895
    };
896
    (
897
        $(#[$filtered:meta])*
898
        // $next != `cfg`
899
        ? #[$next:ident $($nextargs:tt)*]
900
        $(? #[$rest:ident $($restargs:tt)*])*
901
        const $($item:tt)*
902
    ) => {
903
        __impl_bitflags! {
904
            $(#[$filtered])*
905
            // $next filtered out
906
            $(? #[$rest $($restargs)*])*
907
            const $($item)*
908
        }
909
    };
910
    (
911
        $(#[$filtered:meta])*
912
        const $($item:tt)*
913
    ) => {
914
        $(#[$filtered])*
915
        const $($item)*
916
    };
917
}
918
919
// Same as std::stringify but callable from __impl_bitflags, which needs to use
920
// local_inner_macros so can only directly call macros from this crate.
921
#[macro_export]
922
#[doc(hidden)]
923
macro_rules! __bitflags_stringify {
924
    ($s:ident) => {
925
        stringify!($s)
926
    };
927
}
928
929
#[cfg(feature = "example_generated")]
930
pub mod example_generated;
931
932
#[cfg(test)]
933
mod tests {
934
    use std::collections::hash_map::DefaultHasher;
935
    use std::hash::{Hash, Hasher};
936
937
    bitflags! {
938
        #[doc = "> The first principle is that you must not fool yourself — and"]
939
        #[doc = "> you are the easiest person to fool."]
940
        #[doc = "> "]
941
        #[doc = "> - Richard Feynman"]
942
        struct Flags: u32 {
943
            const A = 0b00000001;
944
            #[doc = "<pcwalton> macros are way better at generating code than trans is"]
945
            const B = 0b00000010;
946
            const C = 0b00000100;
947
            #[doc = "* cmr bed"]
948
            #[doc = "* strcat table"]
949
            #[doc = "<strcat> wait what?"]
950
            const ABC = Self::A.bits | Self::B.bits | Self::C.bits;
951
        }
952
    }
953
954
    bitflags! {
955
        struct _CfgFlags: u32 {
956
            #[cfg(unix)]
957
            const _CFG_A = 0b01;
958
            #[cfg(windows)]
959
            const _CFG_B = 0b01;
960
            #[cfg(unix)]
961
            const _CFG_C = Self::_CFG_A.bits | 0b10;
962
        }
963
    }
964
965
    bitflags! {
966
        struct AnotherSetOfFlags: i8 {
967
            const ANOTHER_FLAG = -1_i8;
968
        }
969
    }
970
971
    bitflags! {
972
        struct LongFlags: u32 {
973
            const LONG_A = 0b1111111111111111;
974
        }
975
    }
976
977
    #[test]
978
    fn test_bits() {
979
        assert_eq!(Flags::empty().bits(), 0b00000000);
980
        assert_eq!(Flags::A.bits(), 0b00000001);
981
        assert_eq!(Flags::ABC.bits(), 0b00000111);
982
983
        assert_eq!(AnotherSetOfFlags::empty().bits(), 0b00);
984
        assert_eq!(AnotherSetOfFlags::ANOTHER_FLAG.bits(), !0_i8);
985
    }
986
987
    #[test]
988
    fn test_from_bits() {
989
        assert_eq!(Flags::from_bits(0), Some(Flags::empty()));
990
        assert_eq!(Flags::from_bits(0b1), Some(Flags::A));
991
        assert_eq!(Flags::from_bits(0b10), Some(Flags::B));
992
        assert_eq!(Flags::from_bits(0b11), Some(Flags::A | Flags::B));
993
        assert_eq!(Flags::from_bits(0b1000), None);
994
995
        assert_eq!(
996
            AnotherSetOfFlags::from_bits(!0_i8),
997
            Some(AnotherSetOfFlags::ANOTHER_FLAG)
998
        );
999
    }
1000
1001
    #[test]
1002
    fn test_from_bits_truncate() {
1003
        assert_eq!(Flags::from_bits_truncate(0), Flags::empty());
1004
        assert_eq!(Flags::from_bits_truncate(0b1), Flags::A);
1005
        assert_eq!(Flags::from_bits_truncate(0b10), Flags::B);
1006
        assert_eq!(Flags::from_bits_truncate(0b11), (Flags::A | Flags::B));
1007
        assert_eq!(Flags::from_bits_truncate(0b1000), Flags::empty());
1008
        assert_eq!(Flags::from_bits_truncate(0b1001), Flags::A);
1009
1010
        assert_eq!(
1011
            AnotherSetOfFlags::from_bits_truncate(0_i8),
1012
            AnotherSetOfFlags::empty()
1013
        );
1014
    }
1015
1016
    #[test]
1017
    fn test_from_bits_unchecked() {
1018
        let extra = unsafe { Flags::from_bits_unchecked(0b1000) };
1019
        assert_eq!(unsafe { Flags::from_bits_unchecked(0) }, Flags::empty());
1020
        assert_eq!(unsafe { Flags::from_bits_unchecked(0b1) }, Flags::A);
1021
        assert_eq!(unsafe { Flags::from_bits_unchecked(0b10) }, Flags::B);
1022
        assert_eq!(unsafe { Flags::from_bits_unchecked(0b11) }, (Flags::A | Flags::B));
1023
        assert_eq!(unsafe { Flags::from_bits_unchecked(0b1000) }, (extra | Flags::empty()));
1024
        assert_eq!(unsafe { Flags::from_bits_unchecked(0b1001) }, (extra | Flags::A));
1025
    }
1026
1027
    #[test]
1028
    fn test_is_empty() {
1029
        assert!(Flags::empty().is_empty());
1030
        assert!(!Flags::A.is_empty());
1031
        assert!(!Flags::ABC.is_empty());
1032
1033
        assert!(!AnotherSetOfFlags::ANOTHER_FLAG.is_empty());
1034
    }
1035
1036
    #[test]
1037
    fn test_is_all() {
1038
        assert!(Flags::all().is_all());
1039
        assert!(!Flags::A.is_all());
1040
        assert!(Flags::ABC.is_all());
1041
1042
        assert!(AnotherSetOfFlags::ANOTHER_FLAG.is_all());
1043
    }
1044
1045
    #[test]
1046
    fn test_two_empties_do_not_intersect() {
1047
        let e1 = Flags::empty();
1048
        let e2 = Flags::empty();
1049
        assert!(!e1.intersects(e2));
1050
1051
        assert!(AnotherSetOfFlags::ANOTHER_FLAG.intersects(AnotherSetOfFlags::ANOTHER_FLAG));
1052
    }
1053
1054
    #[test]
1055
    fn test_empty_does_not_intersect_with_full() {
1056
        let e1 = Flags::empty();
1057
        let e2 = Flags::ABC;
1058
        assert!(!e1.intersects(e2));
1059
    }
1060
1061
    #[test]
1062
    fn test_disjoint_intersects() {
1063
        let e1 = Flags::A;
1064
        let e2 = Flags::B;
1065
        assert!(!e1.intersects(e2));
1066
    }
1067
1068
    #[test]
1069
    fn test_overlapping_intersects() {
1070
        let e1 = Flags::A;
1071
        let e2 = Flags::A | Flags::B;
1072
        assert!(e1.intersects(e2));
1073
    }
1074
1075
    #[test]
1076
    fn test_contains() {
1077
        let e1 = Flags::A;
1078
        let e2 = Flags::A | Flags::B;
1079
        assert!(!e1.contains(e2));
1080
        assert!(e2.contains(e1));
1081
        assert!(Flags::ABC.contains(e2));
1082
1083
        assert!(AnotherSetOfFlags::ANOTHER_FLAG.contains(AnotherSetOfFlags::ANOTHER_FLAG));
1084
    }
1085
1086
    #[test]
1087
    fn test_insert() {
1088
        let mut e1 = Flags::A;
1089
        let e2 = Flags::A | Flags::B;
1090
        e1.insert(e2);
1091
        assert_eq!(e1, e2);
1092
1093
        let mut e3 = AnotherSetOfFlags::empty();
1094
        e3.insert(AnotherSetOfFlags::ANOTHER_FLAG);
1095
        assert_eq!(e3, AnotherSetOfFlags::ANOTHER_FLAG);
1096
    }
1097
1098
    #[test]
1099
    fn test_remove() {
1100
        let mut e1 = Flags::A | Flags::B;
1101
        let e2 = Flags::A | Flags::C;
1102
        e1.remove(e2);
1103
        assert_eq!(e1, Flags::B);
1104
1105
        let mut e3 = AnotherSetOfFlags::ANOTHER_FLAG;
1106
        e3.remove(AnotherSetOfFlags::ANOTHER_FLAG);
1107
        assert_eq!(e3, AnotherSetOfFlags::empty());
1108
    }
1109
1110
    #[test]
1111
    fn test_operators() {
1112
        let e1 = Flags::A | Flags::C;
1113
        let e2 = Flags::B | Flags::C;
1114
        assert_eq!((e1 | e2), Flags::ABC); // union
1115
        assert_eq!((e1 & e2), Flags::C); // intersection
1116
        assert_eq!((e1 - e2), Flags::A); // set difference
1117
        assert_eq!(!e2, Flags::A); // set complement
1118
        assert_eq!(e1 ^ e2, Flags::A | Flags::B); // toggle
1119
        let mut e3 = e1;
1120
        e3.toggle(e2);
1121
        assert_eq!(e3, Flags::A | Flags::B);
1122
1123
        let mut m4 = AnotherSetOfFlags::empty();
1124
        m4.toggle(AnotherSetOfFlags::empty());
1125
        assert_eq!(m4, AnotherSetOfFlags::empty());
1126
    }
1127
1128
    #[test]
1129
    fn test_operators_unchecked() {
1130
        let extra = unsafe { Flags::from_bits_unchecked(0b1000) };
1131
        let e1 = Flags::A | Flags::C | extra;
1132
        let e2 = Flags::B | Flags::C;
1133
        assert_eq!((e1 | e2), (Flags::ABC | extra)); // union
1134
        assert_eq!((e1 & e2), Flags::C); // intersection
1135
        assert_eq!((e1 - e2), (Flags::A | extra)); // set difference
1136
        assert_eq!(!e2, Flags::A); // set complement
1137
        assert_eq!(!e1, Flags::B); // set complement
1138
        assert_eq!(e1 ^ e2, Flags::A | Flags::B | extra); // toggle
1139
        let mut e3 = e1;
1140
        e3.toggle(e2);
1141
        assert_eq!(e3, Flags::A | Flags::B | extra);
1142
    }
1143
1144
    #[test]
1145
    fn test_set() {
1146
        let mut e1 = Flags::A | Flags::C;
1147
        e1.set(Flags::B, true);
1148
        e1.set(Flags::C, false);
1149
1150
        assert_eq!(e1, Flags::A | Flags::B);
1151
    }
1152
1153
    #[test]
1154
    fn test_assignment_operators() {
1155
        let mut m1 = Flags::empty();
1156
        let e1 = Flags::A | Flags::C;
1157
        // union
1158
        m1 |= Flags::A;
1159
        assert_eq!(m1, Flags::A);
1160
        // intersection
1161
        m1 &= e1;
1162
        assert_eq!(m1, Flags::A);
1163
        // set difference
1164
        m1 -= m1;
1165
        assert_eq!(m1, Flags::empty());
1166
        // toggle
1167
        m1 ^= e1;
1168
        assert_eq!(m1, e1);
1169
    }
1170
1171
1172
    #[cfg(bitflags_const_fn)]
1173
    #[test]
1174
    fn test_const_fn() {
1175
        const _M1: Flags = Flags::empty();
1176
1177
        const M2: Flags = Flags::A;
1178
        assert_eq!(M2, Flags::A);
1179
1180
        const M3: Flags = Flags::C;
1181
        assert_eq!(M3, Flags::C);
1182
    }
1183
1184
    #[test]
1185
    fn test_extend() {
1186
        let mut flags;
1187
1188
        flags = Flags::empty();
1189
        flags.extend([].iter().cloned());
1190
        assert_eq!(flags, Flags::empty());
1191
1192
        flags = Flags::empty();
1193
        flags.extend([Flags::A, Flags::B].iter().cloned());
1194
        assert_eq!(flags, Flags::A | Flags::B);
1195
1196
        flags = Flags::A;
1197
        flags.extend([Flags::A, Flags::B].iter().cloned());
1198
        assert_eq!(flags, Flags::A | Flags::B);
1199
1200
        flags = Flags::B;
1201
        flags.extend([Flags::A, Flags::ABC].iter().cloned());
1202
        assert_eq!(flags, Flags::ABC);
1203
    }
1204
1205
    #[test]
1206
    fn test_from_iterator() {
1207
        assert_eq!([].iter().cloned().collect::<Flags>(), Flags::empty());
1208
        assert_eq!(
1209
            [Flags::A, Flags::B].iter().cloned().collect::<Flags>(),
1210
            Flags::A | Flags::B
1211
        );
1212
        assert_eq!(
1213
            [Flags::A, Flags::ABC].iter().cloned().collect::<Flags>(),
1214
            Flags::ABC
1215
        );
1216
    }
1217
1218
    #[test]
1219
    fn test_lt() {
1220
        let mut a = Flags::empty();
1221
        let mut b = Flags::empty();
1222
1223
        assert!(!(a < b) && !(b < a));
1224
        b = Flags::B;
1225
        assert!(a < b);
1226
        a = Flags::C;
1227
        assert!(!(a < b) && b < a);
1228
        b = Flags::C | Flags::B;
1229
        assert!(a < b);
1230
    }
1231
1232
    #[test]
1233
    fn test_ord() {
1234
        let mut a = Flags::empty();
1235
        let mut b = Flags::empty();
1236
1237
        assert!(a <= b && a >= b);
1238
        a = Flags::A;
1239
        assert!(a > b && a >= b);
1240
        assert!(b < a && b <= a);
1241
        b = Flags::B;
1242
        assert!(b > a && b >= a);
1243
        assert!(a < b && a <= b);
1244
    }
1245
1246
    fn hash<T: Hash>(t: &T) -> u64 {
1247
        let mut s = DefaultHasher::new();
1248
        t.hash(&mut s);
1249
        s.finish()
1250
    }
1251
1252
    #[test]
1253
    fn test_hash() {
1254
        let mut x = Flags::empty();
1255
        let mut y = Flags::empty();
1256
        assert_eq!(hash(&x), hash(&y));
1257
        x = Flags::all();
1258
        y = Flags::ABC;
1259
        assert_eq!(hash(&x), hash(&y));
1260
    }
1261
1262
    #[test]
1263
    fn test_debug() {
1264
        assert_eq!(format!("{:?}", Flags::A | Flags::B), "A | B");
1265
        assert_eq!(format!("{:?}", Flags::empty()), "(empty)");
1266
        assert_eq!(format!("{:?}", Flags::ABC), "A | B | C | ABC");
1267
        let extra = unsafe { Flags::from_bits_unchecked(0xb8) };
1268
        assert_eq!(format!("{:?}", extra), "0xb8");
1269
        assert_eq!(format!("{:?}", Flags::A | extra), "A | 0xb8");
1270
        assert_eq!(format!("{:?}", Flags::ABC | extra), "A | B | C | ABC | 0xb8");
1271
    }
1272
1273
    #[test]
1274
    fn test_binary() {
1275
        assert_eq!(format!("{:b}", Flags::ABC), "111");
1276
        assert_eq!(format!("{:#b}", Flags::ABC), "0b111");
1277
        let extra = unsafe { Flags::from_bits_unchecked(0b1010000) };
1278
        assert_eq!(format!("{:b}", Flags::ABC | extra), "1010111");
1279
        assert_eq!(format!("{:#b}", Flags::ABC | extra), "0b1010111");
1280
    }
1281
1282
    #[test]
1283
    fn test_octal() {
1284
        assert_eq!(format!("{:o}", LongFlags::LONG_A), "177777");
1285
        assert_eq!(format!("{:#o}", LongFlags::LONG_A), "0o177777");
1286
        let extra = unsafe { LongFlags::from_bits_unchecked(0o5000000) };
1287
        assert_eq!(format!("{:o}", LongFlags::LONG_A | extra), "5177777");
1288
        assert_eq!(format!("{:#o}", LongFlags::LONG_A | extra), "0o5177777");
1289
    }
1290
1291
    #[test]
1292
    fn test_lowerhex() {
1293
        assert_eq!(format!("{:x}", LongFlags::LONG_A), "ffff");
1294
        assert_eq!(format!("{:#x}", LongFlags::LONG_A), "0xffff");
1295
        let extra = unsafe { LongFlags::from_bits_unchecked(0xe00000) };
1296
        assert_eq!(format!("{:x}", LongFlags::LONG_A | extra), "e0ffff");
1297
        assert_eq!(format!("{:#x}", LongFlags::LONG_A | extra), "0xe0ffff");
1298
    }
1299
1300
    #[test]
1301
    fn test_upperhex() {
1302
        assert_eq!(format!("{:X}", LongFlags::LONG_A), "FFFF");
1303
        assert_eq!(format!("{:#X}", LongFlags::LONG_A), "0xFFFF");
1304
        let extra = unsafe { LongFlags::from_bits_unchecked(0xe00000) };
1305
        assert_eq!(format!("{:X}", LongFlags::LONG_A | extra), "E0FFFF");
1306
        assert_eq!(format!("{:#X}", LongFlags::LONG_A | extra), "0xE0FFFF");
1307
    }
1308
1309
    mod submodule {
1310
        bitflags! {
1311
            pub struct PublicFlags: i8 {
1312
                const X = 0;
1313
            }
1314
        }
1315
        bitflags! {
1316
            struct PrivateFlags: i8 {
1317
                const Y = 0;
1318
            }
1319
        }
1320
1321
        #[test]
1322
        fn test_private() {
1323
            let _ = PrivateFlags::Y;
1324
        }
1325
    }
1326
1327
    #[test]
1328
    fn test_public() {
1329
        let _ = submodule::PublicFlags::X;
1330
    }
1331
1332
    mod t1 {
1333
        mod foo {
1334
            pub type Bar = i32;
1335
        }
1336
1337
        bitflags! {
1338
            /// baz
1339
            struct Flags: foo::Bar {
1340
                const A = 0b00000001;
1341
                #[cfg(foo)]
1342
                const B = 0b00000010;
1343
                #[cfg(foo)]
1344
                const C = 0b00000010;
1345
            }
1346
        }
1347
    }
1348
1349
    #[test]
1350
    fn test_in_function() {
1351
        bitflags! {
1352
           struct Flags: u8 {
1353
                const A = 1;
1354
                #[cfg(any())] // false
1355
                const B = 2;
1356
            }
1357
        }
1358
        assert_eq!(Flags::all(), Flags::A);
1359
        assert_eq!(format!("{:?}", Flags::A), "A");
1360
    }
1361
1362
    #[test]
1363
    fn test_deprecated() {
1364
        bitflags! {
1365
            pub struct TestFlags: u32 {
1366
                #[deprecated(note = "Use something else.")]
1367
                const ONE = 1;
1368
            }
1369
        }
1370
    }
1371
1372
    #[test]
1373
    fn test_pub_crate() {
1374
        mod module {
1375
            bitflags! {
1376
                pub (crate) struct Test: u8 {
1377
                    const FOO = 1;
1378
                }
1379
            }
1380
        }
1381
1382
        assert_eq!(module::Test::FOO.bits(), 1);
1383
    }
1384
1385
    #[test]
1386
    fn test_pub_in_module() {
1387
        mod module {
1388
            mod submodule {
1389
                bitflags! {
1390
                    // `pub (in super)` means only the module `module` will
1391
                    // be able to access this.
1392
                    pub (in super) struct Test: u8 {
1393
                        const FOO = 1;
1394
                    }
1395
                }
1396
            }
1397
1398
            mod test {
1399
                // Note: due to `pub (in super)`,
1400
                // this cannot be accessed directly by the testing code.
1401
                pub(super) fn value() -> u8 {
1402
                    super::submodule::Test::FOO.bits()
1403
                }
1404
            }
1405
1406
            pub fn value() -> u8 {
1407
                test::value()
1408
            }
1409
        }
1410
1411
        assert_eq!(module::value(), 1)
1412
    }
1413
1414
    #[test]
1415
    fn test_zero_value_flags() {
1416
        bitflags! {
1417
            struct Flags: u32 {
1418
                const NONE = 0b0;
1419
                const SOME = 0b1;
1420
            }
1421
        }
1422
1423
        assert!(Flags::empty().contains(Flags::NONE));
1424
        assert!(Flags::SOME.contains(Flags::NONE));
1425
        assert!(Flags::NONE.is_empty());
1426
1427
        assert_eq!(format!("{:?}", Flags::empty()), "NONE");
1428
        assert_eq!(format!("{:?}", Flags::SOME), "SOME");
1429
    }
1430
}