16994f6b1SLoGin use core::{intrinsics::unlikely, marker::PhantomData}; 26994f6b1SLoGin 36994f6b1SLoGin use crate::traits::BitOps; 46994f6b1SLoGin 552da9a59SGnoCiYeH #[derive(Debug, Clone)] 6b2ca6800SLoGin pub(crate) struct BitMapCore<T: BitOps> { 76994f6b1SLoGin phantom: PhantomData<T>, 86994f6b1SLoGin } 96994f6b1SLoGin 10b2ca6800SLoGin impl<T: BitOps> BitMapCore<T> { new() -> Self116994f6b1SLoGin pub const fn new() -> Self { 126994f6b1SLoGin Self { 136994f6b1SLoGin phantom: PhantomData, 146994f6b1SLoGin } 156994f6b1SLoGin } 166994f6b1SLoGin 176994f6b1SLoGin /// 获取位图中的某一位 get(&self, n: usize, data: &[T], index: usize) -> Option<bool>18b2ca6800SLoGin pub(crate) fn get(&self, n: usize, data: &[T], index: usize) -> Option<bool> { 19b2ca6800SLoGin if unlikely(index >= n) { 206994f6b1SLoGin return None; 216994f6b1SLoGin } 226994f6b1SLoGin 236994f6b1SLoGin let element_index = index / T::bit_size(); 246994f6b1SLoGin let bit_index = index % T::bit_size(); 256994f6b1SLoGin 266994f6b1SLoGin let element = data.get(element_index)?; 276994f6b1SLoGin let bit = <T as BitOps>::get(element, bit_index); 286994f6b1SLoGin 296994f6b1SLoGin Some(bit) 306994f6b1SLoGin } 316994f6b1SLoGin 326994f6b1SLoGin /// 设置位图中的某一位 set(&self, n: usize, data: &mut [T], index: usize, value: bool) -> Option<bool>33b2ca6800SLoGin pub(crate) fn set(&self, n: usize, data: &mut [T], index: usize, value: bool) -> Option<bool> { 34b2ca6800SLoGin if unlikely(index >= n) { 356994f6b1SLoGin return None; 366994f6b1SLoGin } 376994f6b1SLoGin let element_index = index / T::bit_size(); 386994f6b1SLoGin let bit_index = index % T::bit_size(); 396994f6b1SLoGin 406994f6b1SLoGin let element = data.get_mut(element_index)?; 416994f6b1SLoGin let bit = <T as BitOps>::set(element, bit_index, value); 426994f6b1SLoGin 436994f6b1SLoGin Some(bit) 446994f6b1SLoGin } 456994f6b1SLoGin set_all(&self, n: usize, data: &mut [T], value: bool)46b2ca6800SLoGin pub(crate) fn set_all(&self, n: usize, data: &mut [T], value: bool) { 476994f6b1SLoGin let val = if value { T::max() } else { T::zero() }; 486994f6b1SLoGin for element in data.iter_mut() { 496994f6b1SLoGin *element = val; 506994f6b1SLoGin } 516994f6b1SLoGin 526994f6b1SLoGin // 特殊处理最后一个元素 536994f6b1SLoGin let last_element = data.last_mut().unwrap(); 54b2ca6800SLoGin let mask = T::make_mask(n % T::bit_size()); 556994f6b1SLoGin if mask != T::zero() { 566994f6b1SLoGin *last_element &= mask; 576994f6b1SLoGin } 586994f6b1SLoGin } 596994f6b1SLoGin 606994f6b1SLoGin /// 获取位图中第一个为1的位 first_index(&self, data: &[T]) -> Option<usize>616994f6b1SLoGin pub(crate) fn first_index(&self, data: &[T]) -> Option<usize> { 626994f6b1SLoGin for (i, element) in data.iter().enumerate() { 636994f6b1SLoGin let bit = <T as BitOps>::first_index(element); 64*b5b571e0SLoGin if let Some(b) = bit { 65*b5b571e0SLoGin return Some(i * T::bit_size() + b); 666994f6b1SLoGin } 676994f6b1SLoGin } 686994f6b1SLoGin 696994f6b1SLoGin None 706994f6b1SLoGin } 716994f6b1SLoGin 726994f6b1SLoGin /// 获取位图中第一个为0的位 first_false_index(&self, n: usize, data: &[T]) -> Option<usize>73b2ca6800SLoGin pub(crate) fn first_false_index(&self, n: usize, data: &[T]) -> Option<usize> { 746994f6b1SLoGin for (i, element) in data.iter().enumerate() { 756994f6b1SLoGin if let Some(bit) = <T as BitOps>::first_false_index(element) { 76b2ca6800SLoGin return self.make_index(n, i * T::bit_size() + bit); 776994f6b1SLoGin } 786994f6b1SLoGin } 796994f6b1SLoGin 806994f6b1SLoGin None 816994f6b1SLoGin } 826994f6b1SLoGin 836994f6b1SLoGin /// 获取位图中最后一个为1的位 last_index(&self, n: usize, data: &[T]) -> Option<usize>84b2ca6800SLoGin pub(crate) fn last_index(&self, n: usize, data: &[T]) -> Option<usize> { 856994f6b1SLoGin for (i, element) in data.iter().enumerate().rev() { 866994f6b1SLoGin if let Some(bit) = <T as BitOps>::last_index(element) { 87b2ca6800SLoGin return self.make_index(n, i * T::bit_size() + bit); 886994f6b1SLoGin } 896994f6b1SLoGin } 906994f6b1SLoGin 916994f6b1SLoGin None 926994f6b1SLoGin } 936994f6b1SLoGin 946994f6b1SLoGin /// 获取位图中最后一个为0的位 956994f6b1SLoGin /// 966994f6b1SLoGin /// ## 参数 976994f6b1SLoGin /// 986994f6b1SLoGin /// - `data`:位图数据 996994f6b1SLoGin /// - `n`:位图有效位数 last_false_index(&self, n: usize, data: &[T]) -> Option<usize>100b2ca6800SLoGin pub(crate) fn last_false_index(&self, n: usize, data: &[T]) -> Option<usize> { 1016994f6b1SLoGin let mut iter = data.iter().rev(); 1026994f6b1SLoGin let mut last_element = *iter.next()?; 1036994f6b1SLoGin 1046994f6b1SLoGin // 对最后一个元素进行特殊处理,因为最后一个元素可能不是满的 105b2ca6800SLoGin let mut mask = T::make_mask(n % T::bit_size()); 1066994f6b1SLoGin if mask != T::zero() { 1076994f6b1SLoGin <T as BitOps>::invert(&mut mask); 1086994f6b1SLoGin 1096994f6b1SLoGin last_element |= mask; 1106994f6b1SLoGin } 1116994f6b1SLoGin 1126994f6b1SLoGin if let Some(bit) = <T as BitOps>::last_false_index(&last_element) { 113b2ca6800SLoGin return self.make_index(n, (data.len() - 1) * T::bit_size() + bit); 1146994f6b1SLoGin } 1156994f6b1SLoGin 1166994f6b1SLoGin for element in iter { 1176994f6b1SLoGin if let Some(bit) = <T as BitOps>::last_false_index(element) { 118b2ca6800SLoGin return self.make_index(n, (data.len() - 1) * T::bit_size() + bit); 1196994f6b1SLoGin } 1206994f6b1SLoGin } 1216994f6b1SLoGin 1226994f6b1SLoGin None 1236994f6b1SLoGin } 1246994f6b1SLoGin 1256994f6b1SLoGin /// 获取位图中下一个为1的位 next_index(&self, n: usize, data: &[T], index: usize) -> Option<usize>126b2ca6800SLoGin pub(crate) fn next_index(&self, n: usize, data: &[T], index: usize) -> Option<usize> { 127b2ca6800SLoGin if unlikely(index >= n) { 1286994f6b1SLoGin return None; 1296994f6b1SLoGin } 1306994f6b1SLoGin 1316994f6b1SLoGin let element_index = index / T::bit_size(); 1326994f6b1SLoGin let bit_index = index % T::bit_size(); 1336994f6b1SLoGin 1346994f6b1SLoGin let element = data.get(element_index)?; 1356994f6b1SLoGin if let Some(bit) = <T as BitOps>::next_index(element, bit_index) { 136b2ca6800SLoGin return self.make_index(n, element_index * T::bit_size() + bit); 1376994f6b1SLoGin } 1386994f6b1SLoGin 1396994f6b1SLoGin for (i, element) in data.iter().enumerate().skip(element_index + 1) { 1406994f6b1SLoGin if let Some(bit) = <T as BitOps>::first_index(element) { 141b2ca6800SLoGin return self.make_index(n, i * T::bit_size() + bit); 1426994f6b1SLoGin } 1436994f6b1SLoGin } 1446994f6b1SLoGin 1456994f6b1SLoGin None 1466994f6b1SLoGin } 1476994f6b1SLoGin 1486994f6b1SLoGin /// 获取位图中下一个为0的位 next_false_index(&self, n: usize, data: &[T], index: usize) -> Option<usize>149b2ca6800SLoGin pub(crate) fn next_false_index(&self, n: usize, data: &[T], index: usize) -> Option<usize> { 150b2ca6800SLoGin if unlikely(index >= n) { 1516994f6b1SLoGin return None; 1526994f6b1SLoGin } 1536994f6b1SLoGin 1546994f6b1SLoGin let element_index = index / T::bit_size(); 1556994f6b1SLoGin let bit_index = index % T::bit_size(); 1566994f6b1SLoGin 1576994f6b1SLoGin let element = data.get(element_index)?; 1586994f6b1SLoGin if let Some(bit) = <T as BitOps>::next_false_index(element, bit_index) { 159b2ca6800SLoGin return self.make_index(n, element_index * T::bit_size() + bit); 1606994f6b1SLoGin } 1616994f6b1SLoGin 1626994f6b1SLoGin for (i, element) in data.iter().enumerate().skip(element_index + 1) { 1636994f6b1SLoGin if let Some(bit) = <T as BitOps>::first_false_index(element) { 164b2ca6800SLoGin return self.make_index(n, i * T::bit_size() + bit); 1656994f6b1SLoGin } 1666994f6b1SLoGin } 1676994f6b1SLoGin 1686994f6b1SLoGin None 1696994f6b1SLoGin } 1706994f6b1SLoGin 1716994f6b1SLoGin /// 获取位图中上一个为1的位 prev_index(&self, n: usize, data: &[T], index: usize) -> Option<usize>172b2ca6800SLoGin pub(crate) fn prev_index(&self, n: usize, data: &[T], index: usize) -> Option<usize> { 173b2ca6800SLoGin if unlikely(index >= n) { 1746994f6b1SLoGin return None; 1756994f6b1SLoGin } 1766994f6b1SLoGin let element_index = index / T::bit_size(); 1776994f6b1SLoGin let bit_index = index % T::bit_size(); 1786994f6b1SLoGin 1796994f6b1SLoGin let element = data.get(element_index)?; 1806994f6b1SLoGin if let Some(bit) = <T as BitOps>::prev_index(element, bit_index) { 181b2ca6800SLoGin return self.make_index(n, element_index * T::bit_size() + bit); 1826994f6b1SLoGin } 1836994f6b1SLoGin 1846994f6b1SLoGin for (i, element) in data.iter().enumerate().take(element_index).rev() { 1856994f6b1SLoGin if let Some(bit) = <T as BitOps>::last_index(element) { 186b2ca6800SLoGin return self.make_index(n, i * T::bit_size() + bit); 1876994f6b1SLoGin } 1886994f6b1SLoGin } 1896994f6b1SLoGin 1906994f6b1SLoGin None 1916994f6b1SLoGin } 1926994f6b1SLoGin prev_false_index(&self, n: usize, data: &[T], index: usize) -> Option<usize>193b2ca6800SLoGin pub(crate) fn prev_false_index(&self, n: usize, data: &[T], index: usize) -> Option<usize> { 1946994f6b1SLoGin let element_index = index / T::bit_size(); 1956994f6b1SLoGin let bit_index = index % T::bit_size(); 1966994f6b1SLoGin 1976994f6b1SLoGin let element = data.get(element_index)?; 1986994f6b1SLoGin if let Some(bit) = <T as BitOps>::prev_false_index(element, bit_index) { 199b2ca6800SLoGin return self.make_index(n, element_index * T::bit_size() + bit); 2006994f6b1SLoGin } 2016994f6b1SLoGin 2026994f6b1SLoGin for (i, element) in data.iter().enumerate().take(element_index).rev() { 2036994f6b1SLoGin if let Some(bit) = <T as BitOps>::last_false_index(element) { 204b2ca6800SLoGin return self.make_index(n, i * T::bit_size() + bit); 2056994f6b1SLoGin } 2066994f6b1SLoGin } 2076994f6b1SLoGin 2086994f6b1SLoGin None 2096994f6b1SLoGin } 2106994f6b1SLoGin invert(&self, n: usize, data: &mut [T])211b2ca6800SLoGin pub(crate) fn invert(&self, n: usize, data: &mut [T]) { 2126994f6b1SLoGin for element in data.iter_mut() { 2136994f6b1SLoGin <T as BitOps>::invert(element); 2146994f6b1SLoGin } 2156994f6b1SLoGin 2166994f6b1SLoGin // 特殊处理最后一个元素 2176994f6b1SLoGin 2186994f6b1SLoGin let last_element = data.last_mut().unwrap(); 219b2ca6800SLoGin let mask = T::make_mask(n % T::bit_size()); 2206994f6b1SLoGin if mask != T::zero() { 2216994f6b1SLoGin *last_element &= mask; 2226994f6b1SLoGin } 2236994f6b1SLoGin } 2246994f6b1SLoGin is_full(&self, n: usize, data: &[T]) -> bool225b2ca6800SLoGin pub(crate) fn is_full(&self, n: usize, data: &[T]) -> bool { 2266994f6b1SLoGin let mut iter = data.iter().peekable(); 2276994f6b1SLoGin while let Some(element) = iter.next() { 2286994f6b1SLoGin if iter.peek().is_none() { 2296994f6b1SLoGin // 这是最后一个元素,进行特殊处理 2306994f6b1SLoGin let mut element = *element; 231b2ca6800SLoGin let mut mask = T::make_mask(n % T::bit_size()); 2326994f6b1SLoGin if mask == T::zero() { 2336994f6b1SLoGin mask = T::max(); 2346994f6b1SLoGin } 2356994f6b1SLoGin 2366994f6b1SLoGin T::bit_and(&mut element, &mask); 2376994f6b1SLoGin if element == mask { 2386994f6b1SLoGin return true; 2396994f6b1SLoGin } 240*b5b571e0SLoGin } else if element != &T::make_mask(T::bit_size()) { 2416994f6b1SLoGin return false; 2426994f6b1SLoGin } 2436994f6b1SLoGin } 2446994f6b1SLoGin 2456994f6b1SLoGin return false; 2466994f6b1SLoGin } 2476994f6b1SLoGin is_empty(&self, data: &[T]) -> bool2486994f6b1SLoGin pub(crate) fn is_empty(&self, data: &[T]) -> bool { 2496994f6b1SLoGin for element in data.iter() { 2506994f6b1SLoGin if element != &T::zero() { 2516994f6b1SLoGin return false; 2526994f6b1SLoGin } 2536994f6b1SLoGin } 2546994f6b1SLoGin 2556994f6b1SLoGin return true; 2566994f6b1SLoGin } 2576994f6b1SLoGin make_index(&self, n: usize, index: usize) -> Option<usize>258b2ca6800SLoGin fn make_index(&self, n: usize, index: usize) -> Option<usize> { 259b2ca6800SLoGin if unlikely(index >= n) { 2606994f6b1SLoGin return None; 2616994f6b1SLoGin } 2626994f6b1SLoGin 2636994f6b1SLoGin Some(index) 2646994f6b1SLoGin } 2656994f6b1SLoGin } 266