nandi/rustnimpublic Fork 0
d4592812fae6b652d94be442f5b3a408d3ab21b6
Commits
Clone
git clone https://git.rickub.com/nandi/rustnim.git
git clone ssh://git@rickub.com/nandi/rustnim.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

034-bitflags.rs · 41 lines · 2.1 KBRust Blame HistoryRaw
Lower `bitflags!` directly, checked against the real crate af6e50f nandithebull 9h ago1//@ 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.
11use bitflags::bitflags;
12bitflags! {
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}
20fn 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}