123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410 |
- use std::ops::RangeBounds;
- use std::fmt;
- #[derive(Clone)]
- pub struct GenBits(pub Vec<bool>);
- impl GenBits {
- pub fn new(size: usize) -> Self {
- GenBits(vec![false; size])
- }
- pub fn clear(&mut self) {
- for i in 0..self.0.len() {
- self.0[i] = false;
- }
- }
- pub fn fill(&mut self, value: bool) {
- for i in 0..self.0.len() {
- self.0[i] = value;
- }
- }
- pub fn set(&mut self, bit: usize, state: bool) {
- self.0[bit] = state;
- }
- pub fn get(&self, bit: usize) -> bool {
- self.0[bit]
- }
- pub fn set_bits<R: RangeBounds<usize> + IntoIterator<Item = usize>>(&mut self, bits: R) {
- for i in bits {
- self.0[i as usize] = true;
- }
- }
- pub fn count_set(&self) -> usize {
- self.0.iter().filter(|&x| *x).count()
- }
-
- #[deprecated = "Use iter() instead."]
-
- pub fn indexes(&self) -> impl Iterator<Item = usize> + '_ {
- self.0.iter().enumerate().filter(|x| *x.1).map(|x| x.0)
- }
-
- pub fn iter(&self) -> impl Iterator<Item = usize> + '_ {
- self.0.iter().enumerate().filter(|x| *x.1).map(|x| x.0)
- }
-
-
-
- pub fn display(&self) -> String {
- self.0
- .iter()
- .enumerate()
- .filter(|x| *x.1)
- .map(|x| x.0)
- .map(|i| (i + 1).to_string())
-
- .collect::<Vec<_>>()
- .join(",")
- }
- }
- impl fmt::Debug for GenBits {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "({})", self.0.iter().enumerate().filter(|x| *x.1).map(|x| x.0.to_string()).collect::<Vec<_>>().join(","))
- }
- }
- impl fmt::Display for GenBits {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- write!(f, "({})", self.0.iter().enumerate().filter(|x| *x.1).map(|x| x.0.to_string()).collect::<Vec<_>>().join(","))
- }
- }
- impl PartialEq for GenBits {
- fn eq(&self, other: &Self) -> bool {
- if self.0.len() != other.0.len() {
- return false;
- }
- for i in 0..self.0.len() {
- if self.0[i] != other.0[i] {
- return false;
- }
- }
- true
- }
- }
- #[cfg(test)]
- mod tests {
-
- use crate::bits::*;
- #[test]
- fn check_u16() {
- const SIZE: usize = 9;
- let mut p = GenBits::new(SIZE);
- p.clear();
- for i in 0..9 {
- let mut result = p.get(i);
- assert_eq!(result, false);
- p.set(i, true);
- result = p.get(i);
- assert_eq!(result, true);
- }
- p = GenBits::new(SIZE);
- p.set(3, true);
- p.set(5, true);
- p.set(6, true);
- assert_eq!(3, p.count_set());
- let values: Vec<usize> = p.iter().collect();
- assert_eq!(values, vec!(3, 5, 6));
- assert_eq!(3, p.count_set());
- p.set(0, true);
- assert_eq!(4, p.count_set());
- p = GenBits::new(SIZE);
- p.set_bits(0..6);
- for i in 0..6 {
- let result = p.get(i);
- assert_eq!(result, true);
- }
- assert_eq!(p.get(6), false);
- }
- #[test]
- fn check_u32() {
- const SIZE: usize = 29;
- let mut p = GenBits::new(SIZE);
- p.clear();
- for i in 0..29 {
- let mut result = p.get(i);
- assert_eq!(result, false);
- p.set(i, true);
- result = p.get(i);
- assert_eq!(result, true);
- }
- p = GenBits::new(SIZE);
- p.set(13, true);
- p.set(15, true);
- p.set(26, true);
- assert_eq!(3, p.count_set());
- let values: Vec<usize> = p.iter().collect();
- assert_eq!(values, vec!(13, 15, 26));
- assert_eq!(3, p.count_set());
- p.set(0, true);
- assert_eq!(4, p.count_set());
- p = GenBits::new(SIZE);
- p.set_bits(10..26);
- for i in 10..26 {
- let result = p.get(i);
- assert_eq!(result, true);
- }
- assert_eq!(p.get(9), false);
- assert_eq!(p.get(27), false);
- }
- }
|