xref: /DragonOS/kernel/crates/bitmap/src/bitmap_core.rs (revision b5b571e02693d91eb6918d3b7561e088c3e7ee81)
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