# Description This library exposes a vector called BoolVec which allows you to store 8 booleans in a single byte. Basically a boolean only occupies a single bit. # How to use Please check out the documentation on [docs.rs](https://docs.rs/bool_vec/latest/) and the examples below ## Examples ### Initializing an empty BoolVec To create a new `BoolVec` you can use either `BoolVec::new()` or `BoolVec::default()`: ```rust use bool_vec::BoolVec; let bv1 = BoolVec::new(); let bv2 = BoolVec::default(); assert_eq!(bv1, bv2); ``` Or, if you already know your desired capacity you can use `BoolVec::with_capacity(cap)`: ```rust use bool_vec::BoolVec; let bv = BoolVec::with_capacity(3); assert!(bv.capacity() > 0); ``` ### Initializing BoolVec from a Vec or slice You can initialize a `BoolVec` from anything that implements `AsRef<[bool]>` with `BoolVec::from(S)`. This includes vectors and slices: ```rust use bool_vec::BoolVec; let bv1 = BoolVec::from([true, false, true]); let bv2 = BoolVec::from(vec![true, false, true]); assert_eq!(bv1, bv2); ``` ### Initializing using boolvec![] macro Just like `Vec` with the `vec![]` macro, you can initialize a `BoolVec` with the `boolvec![]` macro: ```rust use bool_vec::{BoolVec, boolvec}; let bv1 = BoolVec::new(); let bv2 = boolvec![]; assert_eq!(bv1, bv2); let bv3 = boolvec![true, true, true]; let bv4 = boolvec![true; 3]; assert_eq!(bv3, bv4); ``` ### Pushing values into the BoolVec You can push booleans to the back of the `BoolVec` just like you would with a normal `Vec`: ```rust use bool_vec::boolvec; let mut bv = boolvec![true, false, true]; bv.push(true); assert_eq!(bv, boolvec![true, false, true, true]); ``` ### Popping values off the BoolVec Again, just like with a normal `Vec`, you can remove items at the end of a `BoolVec` with `BoolVec.pop()`. Do note that just like with `Vec`, removed values will be returned. If no value is found, `None` is returned instead: ```rust use bool_vec::boolvec; let mut bv1 = boolvec![true, false, true]; let mut bv2 = boolvec![]; assert_eq!(bv1.pop(), Some(true)); assert_eq!(bv2.pop(), None); assert_eq!(bv1, boolvec![true, false]); ``` ### Getting values from a BoolVec You can get a value from a `BoolVec` with the `BoolVec.get(index)` method. `None` will be returned if `index` is invalid: ```rust use bool_vec::boolvec; let bv = boolvec![true, false, true]; assert_eq!(bv.get(1), Some(false)); assert_eq!(bv.get(3), None); ``` ### Changing values in a BoolVec You can change the value of any `bool` inside a `BoolVec` with the `BoolVec.set(index, value)` method. Just like with `BoolVec.get(index)`, `None` will be returned if `index` is invalid. ```rust use bool_vec::boolvec; let mut bv = boolvec![true, false, true]; assert_eq!(bv.set(0, false), Some(()) ); assert_eq!(bv.get(0), Some(false)); assert_eq!(bv.set(3, false), None); ``` ### Negating values in a BoolVec Negating a value is simple with the `BoolVec.negate(index)` method. This will update your value in the BoolVec, changing it either from `true` to `false`, or from `false` to `true`, and then return the negated value. Again, `None` will be returned if `index` is invalid. ```rust use bool_vec::boolvec; let mut bv = boolvec![true, false, true]; assert_eq!(bv.negate(0), Some(false)); assert_eq!(bv.get(0), Some(false)); assert_eq!(bv.negate(3), None); ``` ### Getting a Vec from a BoolVec You can get a `Vec` from a `BoolVec` with the `BoolVec.into_vec()` method: ```rust use bool_vec::boolvec; let bv = boolvec![true, false, true]; let vector = vec![true, false, true]; assert_eq!(bv.into_vec(), vector); ``` *WARNING: It's recommended to try and work with `BoolVec` when possible. Converting to `Vec` might drastically increase your memory usage* ### Iteration You can iterate using a for loop or convert your `BoolVec` into a `BoolVecIter` directly using `BoolVec.into_iter()`: ```rust use bool_vec::boolvec; let bv = boolvec![true; 3]; for boolean in &bv { assert_eq!(boolean, true); } let mut bv_iter = bv.into_iter(); while let Some(boolean) = bv_iter.next() { assert_eq!(boolean, true); } ``` ### Printing You can either debug print and pretty print your `BoolVec`: ```rust use bool_vec::boolvec; let bv = boolvec![true; 3]; println!("{bv:?}"); println!("{bv:#?}"); // This will print up to 8 booleans in a single line ``` Or print the underlying bytes of your `BoolVec`: ```rust use bool_vec::boolvec; let mut bv = boolvec![true; 9]; bv.set(2, false).unwrap(); assert_eq!(format!("{bv:b}"), "[11011111, 10000000]") ``` It's ok if you don't understand the latter, it's mostly for debug purposes and you don't need to concern with it. ### Other Other methods you might already know from `Vec` are implemented, such as: - `BoolVec.len()` to get the current length of the `BoolVec`; - `BoolVec.capacity()` to get the capacity; - `BoolVec.is_empty()` to check whether the `BoolVec` is empty or not;