xref: /DragonOS/kernel/crates/bitmap/src/traits.rs (revision bd70d2d1f490aabd570a5301b858bd5eb04149fa)
16994f6b1SLoGin use core::ops::{BitAnd, BitAndAssign, BitOrAssign, Not};
26994f6b1SLoGin 
36994f6b1SLoGin /// A trait that defines generalised operations on a `Bits::Store` type.
46994f6b1SLoGin pub trait BitOps:
56994f6b1SLoGin     BitAndAssign + Sized + Copy + PartialEq + Not + BitOrAssign + BitOrAssign + BitAnd
66994f6b1SLoGin {
get(bits: &Self, index: usize) -> bool76994f6b1SLoGin     fn get(bits: &Self, index: usize) -> bool;
set(bits: &mut Self, index: usize, value: bool) -> bool86994f6b1SLoGin     fn set(bits: &mut Self, index: usize, value: bool) -> bool;
set_value(bits: &mut Self, value: Self)96994f6b1SLoGin     fn set_value(bits: &mut Self, value: Self);
len(bits: &Self) -> usize106994f6b1SLoGin     fn len(bits: &Self) -> usize;
first_index(bits: &Self) -> Option<usize>116994f6b1SLoGin     fn first_index(bits: &Self) -> Option<usize>;
first_false_index(bits: &Self) -> Option<usize>126994f6b1SLoGin     fn first_false_index(bits: &Self) -> Option<usize>;
last_index(bits: &Self) -> Option<usize>136994f6b1SLoGin     fn last_index(bits: &Self) -> Option<usize>;
last_false_index(bits: &Self) -> Option<usize>146994f6b1SLoGin     fn last_false_index(bits: &Self) -> Option<usize>;
next_index(bits: &Self, index: usize) -> Option<usize>156994f6b1SLoGin     fn next_index(bits: &Self, index: usize) -> Option<usize>;
next_false_index(bits: &Self, index: usize) -> Option<usize>166994f6b1SLoGin     fn next_false_index(bits: &Self, index: usize) -> Option<usize>;
prev_index(bits: &Self, index: usize) -> Option<usize>176994f6b1SLoGin     fn prev_index(bits: &Self, index: usize) -> Option<usize>;
prev_false_index(bits: &Self, index: usize) -> Option<usize>186994f6b1SLoGin     fn prev_false_index(bits: &Self, index: usize) -> Option<usize>;
bit_and(bits: &mut Self, other_bits: &Self)196994f6b1SLoGin     fn bit_and(bits: &mut Self, other_bits: &Self);
bit_or(bits: &mut Self, other_bits: &Self)206994f6b1SLoGin     fn bit_or(bits: &mut Self, other_bits: &Self);
bit_xor(bits: &mut Self, other_bits: &Self)216994f6b1SLoGin     fn bit_xor(bits: &mut Self, other_bits: &Self);
invert(bits: &mut Self)226994f6b1SLoGin     fn invert(bits: &mut Self);
make_mask(shift: usize) -> Self236994f6b1SLoGin     fn make_mask(shift: usize) -> Self;
bit_size() -> usize246994f6b1SLoGin     fn bit_size() -> usize;
zero() -> Self256994f6b1SLoGin     fn zero() -> Self;
max() -> Self266994f6b1SLoGin     fn max() -> Self;
276994f6b1SLoGin }
286994f6b1SLoGin 
296994f6b1SLoGin macro_rules! bitops_for {
306994f6b1SLoGin     ($target:ty) => {
316994f6b1SLoGin         impl BitOps for $target {
326994f6b1SLoGin             #[inline]
336994f6b1SLoGin             fn get(bits: &Self, index: usize) -> bool {
346994f6b1SLoGin                 bits & (1 << index) != 0
356994f6b1SLoGin             }
366994f6b1SLoGin 
376994f6b1SLoGin             #[inline]
386994f6b1SLoGin             fn set(bits: &mut Self, index: usize, value: bool) -> bool {
396994f6b1SLoGin                 let mask = 1 << index;
406994f6b1SLoGin                 let prev = *bits & mask;
416994f6b1SLoGin                 if value {
426994f6b1SLoGin                     *bits |= mask;
436994f6b1SLoGin                 } else {
446994f6b1SLoGin                     *bits &= !mask;
456994f6b1SLoGin                 }
466994f6b1SLoGin                 prev != 0
476994f6b1SLoGin             }
486994f6b1SLoGin 
496994f6b1SLoGin             #[inline]
506994f6b1SLoGin             fn set_value(bits: &mut Self, value: Self) {
516994f6b1SLoGin                 *bits = value;
526994f6b1SLoGin             }
536994f6b1SLoGin 
546994f6b1SLoGin             #[inline]
556994f6b1SLoGin             fn len(bits: &Self) -> usize {
566994f6b1SLoGin                 bits.count_ones() as usize
576994f6b1SLoGin             }
586994f6b1SLoGin 
596994f6b1SLoGin             #[inline]
606994f6b1SLoGin             fn first_index(bits: &Self) -> Option<usize> {
616994f6b1SLoGin                 if *bits == 0 {
626994f6b1SLoGin                     None
636994f6b1SLoGin                 } else {
646994f6b1SLoGin                     Some(bits.trailing_zeros() as usize)
656994f6b1SLoGin                 }
666994f6b1SLoGin             }
676994f6b1SLoGin 
686994f6b1SLoGin             #[inline]
696994f6b1SLoGin             fn first_false_index(bits: &Self) -> Option<usize> {
706994f6b1SLoGin                 if *bits == <$target>::MAX {
716994f6b1SLoGin                     None
726994f6b1SLoGin                 } else {
736994f6b1SLoGin                     Some(bits.trailing_ones() as usize)
746994f6b1SLoGin                 }
756994f6b1SLoGin             }
766994f6b1SLoGin 
776994f6b1SLoGin             #[inline]
786994f6b1SLoGin             fn last_index(bits: &Self) -> Option<usize> {
796994f6b1SLoGin                 if *bits == 0 {
806994f6b1SLoGin                     None
816994f6b1SLoGin                 } else {
826994f6b1SLoGin                     Some(<$target>::BITS as usize - 1 - (bits.leading_zeros() as usize))
836994f6b1SLoGin                 }
846994f6b1SLoGin             }
856994f6b1SLoGin 
866994f6b1SLoGin             #[inline]
876994f6b1SLoGin             fn last_false_index(bits: &Self) -> Option<usize> {
886994f6b1SLoGin                 if *bits == <$target>::MAX {
896994f6b1SLoGin                     None
906994f6b1SLoGin                 } else {
916994f6b1SLoGin                     Some(<$target>::BITS as usize - 1 - bits.leading_ones() as usize)
926994f6b1SLoGin                 }
936994f6b1SLoGin             }
946994f6b1SLoGin 
956994f6b1SLoGin             #[inline]
966994f6b1SLoGin             fn next_index(bits: &Self, index: usize) -> Option<usize> {
976994f6b1SLoGin                 if *bits == 0 || index >= <$target>::BITS as usize - 1 {
986994f6b1SLoGin                     None
996994f6b1SLoGin                 } else {
1006994f6b1SLoGin                     let intermediate =
1016994f6b1SLoGin                         (*bits & (<$target>::MAX.overflowing_shl(1 + index as u32).0));
1026994f6b1SLoGin 
1036994f6b1SLoGin                     if intermediate == 0 {
1046994f6b1SLoGin                         None
1056994f6b1SLoGin                     } else {
1066994f6b1SLoGin                         Some(intermediate.trailing_zeros() as usize)
1076994f6b1SLoGin                     }
1086994f6b1SLoGin                 }
1096994f6b1SLoGin             }
1106994f6b1SLoGin 
1116994f6b1SLoGin             #[inline]
1126994f6b1SLoGin             fn next_false_index(bits: &Self, index: usize) -> Option<usize> {
1136994f6b1SLoGin                 if *bits == <$target>::MAX || index >= <$target>::BITS as usize - 1 {
1146994f6b1SLoGin                     None
1156994f6b1SLoGin                 } else {
1166994f6b1SLoGin                     let intermediate = (*bits | ((1 << (index + 1)) - 1));
1176994f6b1SLoGin 
1186994f6b1SLoGin                     if intermediate == <$target>::MAX {
1196994f6b1SLoGin                         None
1206994f6b1SLoGin                     } else {
1216994f6b1SLoGin                         Some(intermediate.trailing_ones() as usize)
1226994f6b1SLoGin                     }
1236994f6b1SLoGin                 }
1246994f6b1SLoGin             }
1256994f6b1SLoGin 
1266994f6b1SLoGin             #[inline]
1276994f6b1SLoGin             fn prev_index(bits: &Self, index: usize) -> Option<usize> {
1286994f6b1SLoGin                 if *bits == 0 || index == 0 {
1296994f6b1SLoGin                     None
1306994f6b1SLoGin                 } else {
1316994f6b1SLoGin                     let intermediate = bits & ((1 << index) - 1);
1326994f6b1SLoGin 
1336994f6b1SLoGin                     if intermediate == 0 {
1346994f6b1SLoGin                         None
1356994f6b1SLoGin                     } else {
1366994f6b1SLoGin                         Some(<$target>::BITS as usize - 1 - (intermediate.leading_zeros() as usize))
1376994f6b1SLoGin                     }
1386994f6b1SLoGin                 }
1396994f6b1SLoGin             }
1406994f6b1SLoGin 
1416994f6b1SLoGin             #[inline]
1426994f6b1SLoGin             fn prev_false_index(bits: &Self, index: usize) -> Option<usize> {
1436994f6b1SLoGin                 if *bits == <$target>::MAX || index == 0 {
1446994f6b1SLoGin                     None
1456994f6b1SLoGin                 } else {
1466994f6b1SLoGin                     let intermediate = bits | (<$target>::MAX.overflowing_shl(index as u32).0);
1476994f6b1SLoGin 
1486994f6b1SLoGin                     if intermediate == <$target>::MAX {
1496994f6b1SLoGin                         None
1506994f6b1SLoGin                     } else {
1516994f6b1SLoGin                         Some(<$target>::BITS as usize - 1 - (intermediate.leading_ones() as usize))
1526994f6b1SLoGin                     }
1536994f6b1SLoGin                 }
1546994f6b1SLoGin             }
1556994f6b1SLoGin 
1566994f6b1SLoGin             #[inline]
1576994f6b1SLoGin             fn bit_and(bits: &mut Self, other_bits: &Self) {
1586994f6b1SLoGin                 *bits &= *other_bits;
1596994f6b1SLoGin             }
1606994f6b1SLoGin 
1616994f6b1SLoGin             #[inline]
1626994f6b1SLoGin             fn bit_or(bits: &mut Self, other_bits: &Self) {
1636994f6b1SLoGin                 *bits |= *other_bits;
1646994f6b1SLoGin             }
1656994f6b1SLoGin 
1666994f6b1SLoGin             #[inline]
1676994f6b1SLoGin             fn bit_xor(bits: &mut Self, other_bits: &Self) {
1686994f6b1SLoGin                 *bits ^= *other_bits;
1696994f6b1SLoGin             }
1706994f6b1SLoGin 
1716994f6b1SLoGin             #[inline]
1726994f6b1SLoGin             fn invert(bits: &mut Self) {
1736994f6b1SLoGin                 *bits = !*bits;
1746994f6b1SLoGin             }
1756994f6b1SLoGin 
1766994f6b1SLoGin             #[inline]
1776994f6b1SLoGin             fn make_mask(shift: usize) -> Self {
1786994f6b1SLoGin                 if shift == <$target>::BITS as usize {
1796994f6b1SLoGin                     <$target>::MAX
1806994f6b1SLoGin                 } else {
1816994f6b1SLoGin                     (1 << shift) - 1
1826994f6b1SLoGin                 }
1836994f6b1SLoGin             }
1846994f6b1SLoGin 
1856994f6b1SLoGin             #[inline]
1866994f6b1SLoGin             fn bit_size() -> usize {
1876994f6b1SLoGin                 <$target>::BITS as usize
1886994f6b1SLoGin             }
1896994f6b1SLoGin 
1906994f6b1SLoGin             #[inline]
1916994f6b1SLoGin             fn zero() -> Self {
1926994f6b1SLoGin                 0
1936994f6b1SLoGin             }
1946994f6b1SLoGin 
1956994f6b1SLoGin             #[inline]
1966994f6b1SLoGin             fn max() -> Self {
1976994f6b1SLoGin                 <$target>::MAX
1986994f6b1SLoGin             }
1996994f6b1SLoGin         }
2006994f6b1SLoGin     };
2016994f6b1SLoGin }
2026994f6b1SLoGin 
2036994f6b1SLoGin // 为 `u8` 、 `u16` 、 `u32` 和 `u64` 实现 `BitOps` trait
2046994f6b1SLoGin bitops_for!(u8);
2056994f6b1SLoGin bitops_for!(u16);
2066994f6b1SLoGin bitops_for!(u32);
2076994f6b1SLoGin bitops_for!(u64);
2086994f6b1SLoGin bitops_for!(usize);
2096994f6b1SLoGin 
2106994f6b1SLoGin /// Bitmap应当实现的trait
2116994f6b1SLoGin pub trait BitMapOps<T: BitOps> {
2126994f6b1SLoGin     /// 获取指定index的位
2136994f6b1SLoGin     ///
2146994f6b1SLoGin     /// ## 返回
2156994f6b1SLoGin     ///
2166994f6b1SLoGin     /// - `Some(true)` - 该位为1
2176994f6b1SLoGin     /// - `Some(false)` - 该位为0
2186994f6b1SLoGin     /// - `None` - index超出范围
get(&self, index: usize) -> Option<bool>2196994f6b1SLoGin     fn get(&self, index: usize) -> Option<bool>;
2206994f6b1SLoGin 
2216994f6b1SLoGin     /// 设置指定index的位,并返回该位之前的值
2226994f6b1SLoGin     ///
2236994f6b1SLoGin     /// ## 参数
2246994f6b1SLoGin     ///
2256994f6b1SLoGin     /// - `index` - 位的index
2266994f6b1SLoGin     /// - `value` - 位的新值
2276994f6b1SLoGin     ///
2286994f6b1SLoGin     /// ## 返回
2296994f6b1SLoGin     ///
2306994f6b1SLoGin     /// - `Some(true)` - 该位之前为1
2316994f6b1SLoGin     /// - `Some(false)` - 该位之前为0
2326994f6b1SLoGin     /// - `None` - index超出范围
set(&mut self, index: usize, value: bool) -> Option<bool>2336994f6b1SLoGin     fn set(&mut self, index: usize, value: bool) -> Option<bool>;
2346994f6b1SLoGin 
2356994f6b1SLoGin     /// 将所有位设置为指定值
set_all(&mut self, value: bool)2366994f6b1SLoGin     fn set_all(&mut self, value: bool);
2376994f6b1SLoGin 
2386994f6b1SLoGin     /// 获取bitmap的长度(以位为单位)
2396994f6b1SLoGin     ///
2406994f6b1SLoGin     /// ## Example
2416994f6b1SLoGin     ///
2426994f6b1SLoGin     /// ```
2436994f6b1SLoGin     /// use bitmap::StaticBitmap;
2446994f6b1SLoGin     /// use bitmap::traits::BitMapOps;
2456994f6b1SLoGin     ///
2466994f6b1SLoGin     /// let mut bitmap = StaticBitmap::<34>::new();
2476994f6b1SLoGin     /// assert_eq!(bitmap.len(), 34);
2486994f6b1SLoGin     /// ```
2496994f6b1SLoGin     ///
len(&self) -> usize2506994f6b1SLoGin     fn len(&self) -> usize;
2516994f6b1SLoGin     /// 获取bitmap的大小(以字节为单位)
size(&self) -> usize2526994f6b1SLoGin     fn size(&self) -> usize;
2536994f6b1SLoGin 
2546994f6b1SLoGin     /// 获取第一个为1的位的index
2556994f6b1SLoGin     ///
2566994f6b1SLoGin     /// ## 返回
2576994f6b1SLoGin     ///
2586994f6b1SLoGin     /// - `Some(index)` - 第一个为1的位的index
2596994f6b1SLoGin     /// - `None` - 不存在为1的位
first_index(&self) -> Option<usize>2606994f6b1SLoGin     fn first_index(&self) -> Option<usize>;
2616994f6b1SLoGin 
2626994f6b1SLoGin     /// 获取第一个为0的位的index
2636994f6b1SLoGin     ///
2646994f6b1SLoGin     /// ## 返回
2656994f6b1SLoGin     ///
2666994f6b1SLoGin     /// - `Some(index)` - 第一个为0的位的index
2676994f6b1SLoGin     /// - `None` - 不存在为0的位
first_false_index(&self) -> Option<usize>2686994f6b1SLoGin     fn first_false_index(&self) -> Option<usize>;
2696994f6b1SLoGin 
2706994f6b1SLoGin     /// 获取最后一个为1的位的index
2716994f6b1SLoGin     ///
2726994f6b1SLoGin     /// ## 返回
2736994f6b1SLoGin     ///
2746994f6b1SLoGin     /// - `Some(index)` - 最后一个为1的位的index
2756994f6b1SLoGin     /// - `None` - 不存在为1的位
last_index(&self) -> Option<usize>2766994f6b1SLoGin     fn last_index(&self) -> Option<usize>;
2776994f6b1SLoGin 
2786994f6b1SLoGin     /// 获取最后一个为0的位的index
2796994f6b1SLoGin     ///
2806994f6b1SLoGin     /// ## 返回
2816994f6b1SLoGin     ///
2826994f6b1SLoGin     /// - `Some(index)` - 最后一个为0的位的index
2836994f6b1SLoGin     /// - `None` - 不存在为0的位
last_false_index(&self) -> Option<usize>2846994f6b1SLoGin     fn last_false_index(&self) -> Option<usize>;
2856994f6b1SLoGin 
2866994f6b1SLoGin     /// 获取指定index之后第一个为1的位的index
next_index(&self, index: usize) -> Option<usize>2876994f6b1SLoGin     fn next_index(&self, index: usize) -> Option<usize>;
2886994f6b1SLoGin 
2896994f6b1SLoGin     /// 获取指定index之后第一个为0的位的index
next_false_index(&self, index: usize) -> Option<usize>2906994f6b1SLoGin     fn next_false_index(&self, index: usize) -> Option<usize>;
2916994f6b1SLoGin 
2926994f6b1SLoGin     /// 获取指定index之前第一个为1的位的index
prev_index(&self, index: usize) -> Option<usize>2936994f6b1SLoGin     fn prev_index(&self, index: usize) -> Option<usize>;
2946994f6b1SLoGin 
2956994f6b1SLoGin     /// 获取指定index之前第一个为0的位的index
prev_false_index(&self, index: usize) -> Option<usize>2966994f6b1SLoGin     fn prev_false_index(&self, index: usize) -> Option<usize>;
2976994f6b1SLoGin 
2986994f6b1SLoGin     /// 反转bitmap
invert(&mut self)2996994f6b1SLoGin     fn invert(&mut self);
3006994f6b1SLoGin 
3016994f6b1SLoGin     /// 判断bitmap是否满了
is_full(&self) -> bool3026994f6b1SLoGin     fn is_full(&self) -> bool;
3036994f6b1SLoGin 
3046994f6b1SLoGin     /// 判断bitmap是否为空
is_empty(&self) -> bool3056994f6b1SLoGin     fn is_empty(&self) -> bool;
3066994f6b1SLoGin 
307*b5b571e0SLoGin     /// # Safety
308*b5b571e0SLoGin     /// *不应直接修改字节数组*
309*b5b571e0SLoGin     ///
3106994f6b1SLoGin     /// 将bitmap转换为字节数组
as_bytes(&self) -> &[u8]3116994f6b1SLoGin     unsafe fn as_bytes(&self) -> &[u8];
3126994f6b1SLoGin }
313