blob: 5dbc562781bbc28bdb3ac6af03330f5f7b6409dd [file] [log] [blame]
#![cfg(test)]
use crate::prelude::*;
#[test]
fn iter() {
let bits = bits![0, 1, 0, 1, 0, 1];
let mut iter = bits.iter().by_refs();
assert!(!*iter.next().unwrap());
assert!(!*iter.nth(1).unwrap());
assert!(*iter.next_back().unwrap());
assert!(*iter.nth_back(1).unwrap());
assert_eq!(iter.len(), 0);
assert!(iter.next().is_none());
assert!(iter.next_back().is_none());
assert!(iter.nth(1).is_none());
assert!(iter.nth_back(1).is_none());
}
#[test]
fn iter_mut() {
let bits = bits![mut 0, 1, 0, 0, 1];
let mut iter = bits.iter_mut();
while let Some(mut bit) = iter.nth(1) {
*bit = !*bit;
}
assert_eq!(bits, bits![0, 0, 0, 1, 1]);
}
#[test]
fn windows() {
let bits = bits![0, 1, 0, 1, 1, 0, 0, 1, 1, 1];
let base = bits.as_bitptr();
let mut windows = bits.windows(4);
assert_eq!(windows.len(), 7);
let next = windows.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
assert_eq!(next, bits![0, 1, 0, 1]);
let next_back = windows.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 6);
assert_eq!(next_back, bits![0, 1, 1, 1]);
let nth = windows.nth(2).unwrap();
assert_eq!(unsafe { nth.as_bitptr().offset_from(base) }, 3);
assert_eq!(nth, bits![1, 1, 0, 0]);
let nth_back = windows.nth_back(1).unwrap();
assert_eq!(unsafe { nth_back.as_bitptr().offset_from(base) }, 4);
assert_eq!(nth_back, bits![1, 0, 0, 1]);
assert_eq!(windows.len(), 0);
assert!(windows.next().is_none());
assert!(windows.next_back().is_none());
assert!(windows.nth(1).is_none());
assert!(windows.nth_back(1).is_none());
}
#[test]
fn chunks() {
let bits = bits![0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0];
// ^^^^^ ^^^^^ ^^^^^ ^
let base = bits.as_bitptr();
let mut chunks = bits.chunks(2);
assert_eq!(chunks.len(), 6);
let next = chunks.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
assert_eq!(next, bits![0, 0]);
let next_back = chunks.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 10);
assert_eq!(next_back, bits![0]);
let nth = chunks.nth(1).unwrap();
assert_eq!(unsafe { nth.as_bitptr().offset_from(base) }, 4);
assert_eq!(nth, bits![0, 1]);
let nth_back = chunks.nth_back(1).unwrap();
assert_eq!(unsafe { nth_back.as_bitptr().offset_from(base) }, 6);
assert_eq!(nth_back, bits![1, 0]);
assert_eq!(chunks.len(), 0);
assert!(chunks.next().is_none());
assert!(chunks.next_back().is_none());
assert!(chunks.nth(1).is_none());
assert!(chunks.nth_back(1).is_none());
assert_eq!(bits![0; 2].chunks(3).next().unwrap().len(), 2);
assert_eq!(bits![0; 5].chunks(3).next().unwrap().len(), 3);
assert_eq!(bits![0; 5].chunks(3).nth(1).unwrap().len(), 2);
assert_eq!(bits![0; 8].chunks(3).nth(1).unwrap().len(), 3);
assert_eq!(bits![0; 5].chunks(3).next_back().unwrap().len(), 2);
assert_eq!(bits![0; 6].chunks(3).next_back().unwrap().len(), 3);
assert_eq!(bits![0; 5].chunks(3).nth_back(1).unwrap().len(), 3);
}
#[test]
fn chunks_mut() {
let bits = bits![mut 1; 11];
let base = bits.as_bitptr();
let mut chunks = bits.chunks_mut(2);
assert_eq!(chunks.len(), 6);
let next = chunks.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
next.fill(false);
let next_back = chunks.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 10);
next_back.fill(false);
let nth = chunks.nth(1).unwrap();
assert_eq!(unsafe { nth.as_bitptr().offset_from(base) }, 4);
nth.set(0, false);
let nth_back = chunks.nth_back(1).unwrap();
assert_eq!(unsafe { nth_back.as_bitptr().offset_from(base) }, 6);
nth_back.set(1, false);
assert_eq!(chunks.len(), 0);
assert!(chunks.next().is_none());
assert!(chunks.next_back().is_none());
assert!(chunks.nth(1).is_none());
assert!(chunks.nth_back(1).is_none());
assert_eq!(bits, bits![0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0]);
assert_eq!(bits![mut 0; 2].chunks_mut(3).next().unwrap().len(), 2);
assert_eq!(bits![mut 0; 5].chunks_mut(3).next().unwrap().len(), 3);
assert_eq!(bits![mut 0; 5].chunks_mut(3).nth(1).unwrap().len(), 2);
assert_eq!(bits![mut 0; 8].chunks_mut(3).nth(1).unwrap().len(), 3);
assert_eq!(bits![mut 0; 5].chunks_mut(3).next_back().unwrap().len(), 2);
assert_eq!(bits![mut 0; 6].chunks_mut(3).next_back().unwrap().len(), 3);
assert_eq!(bits![mut 0; 5].chunks_mut(3).nth_back(1).unwrap().len(), 3);
}
#[test]
fn chunks_exact() {
let bits = bits![
0, 0, 0, 1, 1, 1, 0, 0, 1, // next and nth(1)
1, 0, 0, 1, 1, 1, 0, 1, 0, // next_back and nth_back(1)
1, 1, // remainder
];
let base = bits.as_bitptr();
let mut chunks = bits.chunks_exact(3);
assert_eq!(chunks.len(), 6);
let next = chunks.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
assert_eq!(next, bits![0, 0, 0]);
let nth = chunks.nth(1).unwrap();
assert_eq!(unsafe { nth.as_bitptr().offset_from(base) }, 6);
assert_eq!(nth, bits![0, 0, 1]);
let next_back = chunks.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 15);
assert_eq!(next_back, bits![0, 1, 0]);
let nth_back = chunks.nth_back(1).unwrap();
assert_eq!(unsafe { nth_back.as_bitptr().offset_from(base) }, 9);
assert_eq!(nth_back, bits![1, 0, 0]);
let remainder = chunks.remainder();
assert_eq!(unsafe { remainder.as_bitptr().offset_from(base) }, 18);
assert_eq!(remainder, bits![1, 1]);
assert_eq!(chunks.len(), 0);
assert!(chunks.next().is_none());
assert!(chunks.next_back().is_none());
assert!(chunks.nth(1).is_none());
assert!(chunks.nth_back(1).is_none());
}
#[test]
fn chunks_exact_mut() {
let bits = bits![mut 0; 20];
let base = bits.as_bitptr();
let mut chunks = bits.chunks_exact_mut(3);
let next = chunks.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
next.fill(true);
let next_back = chunks.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 15);
next_back.fill(true);
let nth = chunks.nth(1).unwrap();
assert_eq!(unsafe { nth.as_bitptr().offset_from(base) }, 6);
nth.set(2, true);
let nth_back = chunks.nth_back(1).unwrap();
assert_eq!(unsafe { nth_back.as_bitptr().offset_from(base) }, 9);
nth_back.set(0, true);
assert_eq!(chunks.len(), 0);
assert!(chunks.next().is_none());
assert!(chunks.next_back().is_none());
assert!(chunks.nth(1).is_none());
assert!(chunks.nth_back(1).is_none());
assert_eq!(bits, bits![
1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0,
]);
bits.fill(false);
let mut chunks = bits.chunks_exact_mut(3);
let remainder = chunks.take_remainder();
assert_eq!(unsafe { remainder.as_bitptr().offset_from(base) }, 18);
remainder.fill(true);
assert!(chunks.take_remainder().is_empty());
assert!(chunks.into_remainder().is_empty());
assert!(bits.ends_with(bits![0, 0, 1, 1]));
}
#[test]
fn rchunks() {
let bits = bits![1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0];
// ^^ ^^^^^ ^^^^^ ^^^^
let base = bits.as_bitptr();
let mut rchunks = bits.rchunks(2);
let next = rchunks.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 9);
assert_eq!(next, bits![0, 0]);
let next_back = rchunks.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 0);
assert_eq!(next_back, bits![1]);
let nth = rchunks.nth(1).unwrap();
assert_eq!(unsafe { nth.as_bitptr().offset_from(base) }, 5);
assert_eq!(nth, bits![0, 1]);
let nth_back = rchunks.nth_back(1).unwrap();
assert_eq!(unsafe { nth_back.as_bitptr().offset_from(base) }, 3);
assert_eq!(nth_back, bits![1, 0]);
assert_eq!(rchunks.len(), 0);
assert!(rchunks.next().is_none());
assert!(rchunks.next_back().is_none());
assert!(rchunks.nth(1).is_none());
assert!(rchunks.nth_back(1).is_none());
assert_eq!(bits![0; 5].rchunks(3).next().unwrap().len(), 3);
assert_eq!(bits![0; 5].rchunks(3).nth(1).unwrap().len(), 2);
assert_eq!(bits![0; 5].rchunks(3).next_back().unwrap().len(), 2);
assert_eq!(bits![0; 5].rchunks(3).nth_back(1).unwrap().len(), 3);
}
#[test]
fn rchunks_mut() {
let bits = bits![mut 0; 11];
let base = bits.as_bitptr();
let mut rchunks = bits.rchunks_mut(2);
assert_eq!(rchunks.len(), 6);
let next = rchunks.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 9);
next.fill(true);
let next_back = rchunks.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 0);
next_back.fill(true);
let nth = rchunks.nth(1).unwrap();
assert_eq!(unsafe { nth.as_bitptr().offset_from(base) }, 5);
nth.set(0, true);
let nth_back = rchunks.nth_back(1).unwrap();
assert_eq!(unsafe { nth_back.as_bitptr().offset_from(base) }, 3);
nth_back.set(1, true);
assert_eq!(rchunks.len(), 0);
assert!(rchunks.next().is_none());
assert!(rchunks.next_back().is_none());
assert!(rchunks.nth(1).is_none());
assert!(rchunks.nth_back(1).is_none());
assert_eq!(bits, bits![1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1]);
assert_eq!(bits![mut 0; 5].rchunks_mut(3).next().unwrap().len(), 3);
assert_eq!(bits![mut 0; 5].rchunks_mut(3).nth(1).unwrap().len(), 2);
assert_eq!(bits![mut 0; 5].rchunks_mut(3).next_back().unwrap().len(), 2);
assert_eq!(bits![mut 0; 5].rchunks_mut(3).nth_back(1).unwrap().len(), 3);
}
#[test]
fn rchunks_exact() {
let bits = bits![
1, 1, // remainder
0, 1, 0, 1, 1, 1, 0, 0, 1, // nth_back(1) and next
1, 0, 0, 1, 1, 1, 0, 0, 0, // nth(1) and next
];
let base = bits.as_bitptr();
let mut rchunks = bits.rchunks_exact(3);
assert_eq!(rchunks.len(), 6);
let next = rchunks.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 17);
assert_eq!(next, bits![0, 0, 0]);
let nth = rchunks.nth(1).unwrap();
assert_eq!(unsafe { nth.as_bitptr().offset_from(base) }, 11);
assert_eq!(nth, bits![1, 0, 0]);
let next_back = rchunks.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 2);
assert_eq!(next_back, bits![0, 1, 0]);
let nth_back = rchunks.nth_back(1).unwrap();
assert_eq!(unsafe { nth_back.as_bitptr().offset_from(base) }, 8);
assert_eq!(nth_back, bits![0, 0, 1]);
let remainder = rchunks.remainder();
assert_eq!(unsafe { remainder.as_bitptr().offset_from(base) }, 0);
assert_eq!(remainder, bits![1, 1]);
assert_eq!(rchunks.len(), 0);
assert!(rchunks.next().is_none());
assert!(rchunks.next_back().is_none());
assert!(rchunks.nth(1).is_none());
assert!(rchunks.nth_back(1).is_none());
}
#[test]
fn rchunks_exact_mut() {
let bits = bits![mut 0; 20];
let base = bits.as_bitptr();
let mut rchunks = bits.rchunks_exact_mut(3);
let next = rchunks.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 17);
next.fill(true);
let next_back = rchunks.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 2);
next_back.fill(true);
let nth = rchunks.nth(1).unwrap();
assert_eq!(unsafe { nth.as_bitptr().offset_from(base) }, 11);
nth.set(2, true);
let nth_back = rchunks.nth_back(1).unwrap();
assert_eq!(unsafe { nth_back.as_bitptr().offset_from(base) }, 8);
nth_back.set(0, true);
assert_eq!(rchunks.len(), 0);
assert!(rchunks.next().is_none());
assert!(rchunks.next_back().is_none());
assert!(rchunks.nth(1).is_none());
assert!(rchunks.nth_back(1).is_none());
assert_eq!(bits, bits![
0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1
]);
bits.fill(false);
let mut chunks = bits.rchunks_exact_mut(3);
let remainder = chunks.take_remainder();
assert_eq!(unsafe { remainder.as_bitptr().offset_from(base) }, 0);
remainder.fill(true);
assert!(chunks.take_remainder().is_empty());
assert!(chunks.into_remainder().is_empty());
assert!(bits.starts_with(bits![1, 1, 0, 0]));
}
#[test]
fn split() {
let bits = bits![0, 0, 1, 1, 0, 0, 1, 1];
let base = bits.as_bitptr();
let mut split = bits.split(|_, &bit| bit);
let next = split.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
assert_eq!(next, bits![0, 0]);
let next = split.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 3);
assert!(next.is_empty());
let next_back = split.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 8);
assert!(next_back.is_empty());
let next_back = split.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 7);
assert!(next_back.is_empty());
let next_back = split.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 4);
assert_eq!(next_back, bits![0, 0]);
assert!(split.next().is_none());
assert!(split.next_back().is_none());
}
#[test]
fn split_mut() {
let bits = bits![mut 0, 0, 1, 1, 0, 0, 1, 1];
let base = bits.as_bitptr();
let mut split = bits.split_mut(|_, &bit| bit);
let next = split.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
assert_eq!(next, bits![0, 0]);
let next = split.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 3);
assert!(next.is_empty());
let next_back = split.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 8);
assert!(next_back.is_empty());
let next_back = split.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 7);
assert!(next_back.is_empty());
let next_back = split.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 4);
assert_eq!(next_back, bits![0, 0]);
assert!(split.next().is_none());
assert!(split.next_back().is_none());
let bits = bits![mut 0];
let mut split = bits.split_mut(|_, &bit| bit);
assert_eq!(split.next().unwrap(), bits![0]);
assert!(split.next().is_none());
}
#[test]
fn split_inclusive() {
let bits = bits![0, 0, 1, 1, 0, 0, 1, 1];
let base = bits.as_bitptr();
let mut split = bits.split_inclusive(|_, &bit| bit);
let next = split.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
assert_eq!(next, bits![0, 0, 1]);
let next = split.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 3);
assert_eq!(next, bits![1]);
let next_back = split.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 7);
assert_eq!(next_back, bits![1]);
let next_back = split.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 4);
assert_eq!(next_back, bits![0, 0, 1]);
assert!(split.next().is_none());
assert!(split.next_back().is_none());
let bits = bits![0, 1];
let mut split = bits.split_inclusive(|_, &bit| bit);
assert_eq!(split.next(), Some(bits![0, 1]));
assert!(split.next().is_none());
let mut split = bits.split_inclusive(|_, &bit| bit);
assert_eq!(split.next_back(), Some(bits![0, 1]));
assert!(split.next_back().is_none());
assert_eq!(
bits![].split_inclusive(|_, &bit| bit).next_back(),
Some(bits![]),
);
}
#[test]
fn split_inclusive_mut() {
let bits = bits![mut 0, 0, 1, 1, 0, 0, 1, 1];
let base = bits.as_bitptr();
let mut split = bits.split_inclusive_mut(|_, &bit| bit);
let next = split.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
assert_eq!(next, bits![0, 0, 1]);
let next = split.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 3);
assert_eq!(next, bits![1]);
let next_back = split.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 7);
assert_eq!(next_back, bits![1]);
let next_back = split.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 4);
assert_eq!(next_back, bits![0, 0, 1]);
assert!(split.next().is_none());
assert!(split.next_back().is_none());
let bits = bits![mut 0, 1];
let mut split = bits.split_inclusive_mut(|_, &bit| bit);
assert_eq!(split.next().unwrap(), bits![0, 1]);
assert!(split.next().is_none());
let mut split = bits.split_inclusive_mut(|_, &bit| bit);
assert_eq!(split.next_back().unwrap(), bits![0, 1]);
assert!(split.next_back().is_none());
assert_eq!(
bits![mut]
.split_inclusive_mut(|_, &bit| bit)
.next_back()
.unwrap(),
bits![],
);
}
#[test]
fn rsplit() {
let bits = bits![0, 0, 1, 1, 0, 0, 1, 1];
let base = bits.as_bitptr();
let mut rsplit = bits.rsplit(|_, &bit| bit);
let next = rsplit.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 8);
assert!(next.is_empty());
let next = rsplit.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 7);
assert!(next.is_empty());
let next_back = rsplit.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 0);
assert_eq!(next_back, bits![0, 0]);
let next_back = rsplit.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 3);
assert!(next_back.is_empty());
let next_back = rsplit.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 4);
assert_eq!(next_back, bits![0, 0]);
assert!(rsplit.next().is_none());
assert!(rsplit.next_back().is_none());
}
#[test]
fn rsplit_mut() {
let bits = bits![mut 0, 0, 1, 1, 0, 0, 1, 1];
let base = bits.as_bitptr();
let mut rsplit = bits.rsplit_mut(|_, &bit| bit);
let next = rsplit.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 8);
assert!(next.is_empty());
let next = rsplit.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 7);
assert!(next.is_empty());
let next_back = rsplit.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 0);
assert_eq!(next_back, bits![0, 0]);
let next_back = rsplit.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 3);
assert!(next_back.is_empty());
let next_back = rsplit.next_back().unwrap();
assert_eq!(unsafe { next_back.as_bitptr().offset_from(base) }, 4);
assert!(next.is_empty());
assert!(rsplit.next().is_none());
assert!(rsplit.next_back().is_none());
let bits = bits![mut 0];
let mut rsplit = bits.rsplit_mut(|_, &bit| bit);
assert_eq!(rsplit.next().unwrap(), bits![0]);
assert!(rsplit.next().is_none());
}
#[test]
fn splitn() {
let bits = bits![0, 0, 1, 1, 0, 0, 1, 1];
let base = bits.as_bitptr();
let mut splitn = bits.splitn(2, |_, &bit| bit);
let next = splitn.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
assert_eq!(next, bits![0, 0]);
let next = splitn.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 3);
assert_eq!(next, bits[3 ..]);
assert!(splitn.next().is_none());
}
#[test]
fn splitn_mut() {
let bits = bits![mut 0, 0, 1, 1, 0, 0, 1, 1];
let base = bits.as_bitptr();
let mut splitn = bits.splitn_mut(2, |_, &bit| bit);
let next = splitn.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
assert_eq!(next, bits![0, 0]);
let next = splitn.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 3);
assert_eq!(next, bits![1, 0, 0, 1, 1]);
assert!(splitn.next().is_none());
}
#[test]
fn rsplitn() {
let bits = bits![0, 0, 1, 1, 0, 0, 1, 1];
let base = bits.as_bitptr();
let mut rsplitn = bits.rsplitn(2, |_, &bit| bit);
let next = rsplitn.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 8);
assert!(next.is_empty());
let next = rsplitn.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
assert_eq!(next, bits![0, 0, 1, 1, 0, 0, 1]);
}
#[test]
fn rsplitn_mut() {
let bits = bits![mut 0, 0, 1, 1, 0, 0, 1, 1];
let base = bits.as_bitptr();
let mut rsplitn = bits.rsplitn_mut(2, |_, &bit| bit);
let next = rsplitn.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 8);
assert!(next.is_empty());
let next = rsplitn.next().unwrap();
assert_eq!(unsafe { next.as_bitptr().offset_from(base) }, 0);
assert_eq!(next, bits![0, 0, 1, 1, 0, 0, 1]);
assert!(rsplitn.next().is_none());
}
#[test]
fn iter_ones() {
use crate::order::HiLo;
let bits = 0b0100_1001u8.view_bits::<HiLo>();
// ordering: 3210 7654
let mut ones = bits.iter_ones();
assert_eq!(ones.len(), 3);
assert_eq!(ones.next(), Some(2));
assert_eq!(ones.next_back(), Some(7));
assert_eq!(ones.next(), Some(4));
assert!(ones.next().is_none());
}
#[test]
fn iter_zeros() {
use crate::order::HiLo;
let bits = 0b1011_0110u8.view_bits::<HiLo>();
// ordering: 3210 7654
let mut zeros = bits.iter_zeros();
assert_eq!(zeros.len(), 3);
assert_eq!(zeros.next(), Some(2));
assert_eq!(zeros.next_back(), Some(7));
assert_eq!(zeros.next(), Some(4));
assert!(zeros.next().is_none());
}
#[test]
fn trait_impls() {
use core::iter::FusedIterator;
use static_assertions::*;
use crate::slice::iter::{
BitRefIter,
BitValIter,
};
assert_impl_all!(
BitRefIter<'static, usize, Lsb0>: Iterator,
DoubleEndedIterator,
ExactSizeIterator,
FusedIterator
);
assert_impl_all!(
BitValIter<'static, usize, Lsb0>: Iterator,
DoubleEndedIterator,
ExactSizeIterator,
FusedIterator
);
}