From 1ae1341cab537aa4ae9c593400688a184ed7cb62 Mon Sep 17 00:00:00 2001 From: D0A1V2I3D Date: Sun, 5 Feb 2023 15:42:57 +0100 Subject: [PATCH] fixes and utils --- Cargo.toml | 2 +- src/flag_utils.rs | 10 ++++++++++ src/lib.rs | 15 +++++++++++---- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 167d7b1..3a4e770 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "binf" -version = "0.2.1" +version = "0.2.2" edition = "2021" license = "MIT" description = "A crate that adds utilities for dealing with binary flags" diff --git a/src/flag_utils.rs b/src/flag_utils.rs index fd5f038..a5d0bad 100644 --- a/src/flag_utils.rs +++ b/src/flag_utils.rs @@ -13,4 +13,14 @@ pub fn get_flags(flags: i32) -> Vec { } } tvec +} + +pub fn vec_to_flag(vec: Vec) -> u128 { + let mut flag = 0; + for (i, &val) in vec.iter().enumerate() { + if val { + flag |= 1 << i; + } + } + flag } \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index c548451..b8a8ff7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,8 @@ TODO documentation pub mod flag_utils; pub mod macros; +#[cfg(test)] +mod test; ///struct that holds data for a flag and useful functions pub struct Flag { @@ -16,9 +18,7 @@ impl Flag { if value { self.value |= 1 << flag; } else { - if self.get_flag(flag) { - self.value -= 1 << flag; - } + self.value &= !(1 << flag); } } @@ -31,7 +31,7 @@ impl Flag { pub fn get_all_flags(&self) -> Vec { let mut ret = vec![]; for i in 0..128 { - ret.push(&self.value & (1u128 << i) != 0); + ret.push(&self.value & (1 << i) != 0); } for i in (0..ret.len()).rev() { if ret[i] { @@ -42,6 +42,8 @@ impl Flag { ret } + + /// creates Flag from int pub fn new_from_value(value: u128) -> Self { Self {value} @@ -52,6 +54,11 @@ impl Flag { self.value } + /// sets internal value to this + pub fn set_value(&mut self, value: u128) { + self.value = value; + } + /// initializes a Flag with 0, use flag_new! macro to create with flags instead pub fn new() -> Self { Self { value: 0, }