| Lower `bitflags!` directly, checked against the real crate af6e50f nandithebull 10h ago | 1 | //@ extern: bitflags |
| 2 | // `bitflags!` is lowered directly rather than expanded. Expanding it does |
| 3 | // not help: on a one-flag user it produces 869 lines that still call into |
| 4 | // `bitflags::{Bits, Flag, Flags, iter, parser}`, which are themselves 26 |
| 5 | // further `macro_rules!` across five files. What the macro *means* is small |
| 6 | // and stable, so it is implemented; this case is what checks it, against |
| 7 | // bitflags 2.13.2 rather than against anyone's memory of it. |
| 8 | // |
| 9 | // Note `!rw` is complemented and masked to `all()`, and `from_bits` is None |
| 10 | // for any bit outside `all()`. Neither is what a reimplementation guesses. |
| 11 | use bitflags::bitflags; |
| 12 | bitflags! { |
| 13 | #[derive(Copy, Clone, Debug, PartialEq, Eq)] |
| 14 | pub struct Perms: u32 { |
| 15 | const READ = 0b0000_0001; |
| 16 | const WRITE = 0b0000_0010; |
| 17 | const EXEC = 0b0000_0100; |
| 18 | } |
| 19 | } |
| 20 | fn main() { |
| 21 | let r = Perms::READ; |
| 22 | let rw = Perms::READ | Perms::WRITE; |
| 23 | let all = Perms::all(); |
| 24 | println!("bits {} {} {} {}", r.bits(), rw.bits(), all.bits(), Perms::empty().bits()); |
| 25 | println!("contains {} {}", rw.contains(Perms::READ), rw.contains(Perms::EXEC)); |
| 26 | println!("intersects {} {}", rw.intersects(Perms::EXEC), rw.intersects(Perms::READ)); |
| 27 | println!("empty {} {}", rw.is_empty(), Perms::empty().is_empty()); |
| 28 | println!("all {} {}", rw.is_all(), all.is_all()); |
| 29 | println!("ops {} {} {} {}", (rw & Perms::WRITE).bits(), (rw | Perms::EXEC).bits(), (rw ^ Perms::READ).bits(), (!rw).bits()); |
| 30 | println!("diff {} {}", all.difference(Perms::WRITE).bits(), rw.symmetric_difference(Perms::EXEC).bits()); |
| 31 | println!("union {} inter {}", r.union(Perms::EXEC).bits(), all.intersection(rw).bits()); |
| 32 | let mut m = Perms::empty(); |
| 33 | m.insert(Perms::READ); m.insert(Perms::EXEC); m.remove(Perms::READ); m.toggle(Perms::WRITE); |
| 34 | println!("mut {}", m.bits()); |
| 35 | m.set(Perms::EXEC, false); |
| 36 | println!("set {}", m.bits()); |
| 37 | println!("from_bits {:?} {:?}", Perms::from_bits(3), Perms::from_bits(8)); |
| 38 | println!("truncate {}", Perms::from_bits_truncate(9).bits()); |
| 39 | println!("debug {:?} {:?} {:?}", r, rw, Perms::empty()); |
| 40 | println!("eq {} {}", r == Perms::READ, r == rw); |
| 41 | } |