xref: /DragonOS/kernel/crates/bitmap/src/static_bitmap.rs (revision 6994f6b113f6fea7b997ec07130a7bdaecfd67b7)
1*6994f6b1SLoGin use core::mem::size_of;
2*6994f6b1SLoGin 
3*6994f6b1SLoGin use crate::{bitmap_core::BitMapCore, traits::BitMapOps};
4*6994f6b1SLoGin 
5*6994f6b1SLoGin /// 静态位图
6*6994f6b1SLoGin ///
7*6994f6b1SLoGin /// 该位图的大小在编译时确定,不可变
8*6994f6b1SLoGin pub struct StaticBitmap<const N: usize>
9*6994f6b1SLoGin where
10*6994f6b1SLoGin     [(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
11*6994f6b1SLoGin {
12*6994f6b1SLoGin     pub data: [usize; (N + usize::BITS as usize - 1) / (usize::BITS as usize)],
13*6994f6b1SLoGin     core: BitMapCore<usize, N>,
14*6994f6b1SLoGin }
15*6994f6b1SLoGin 
16*6994f6b1SLoGin impl<const N: usize> StaticBitmap<N>
17*6994f6b1SLoGin where
18*6994f6b1SLoGin     [(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
19*6994f6b1SLoGin {
20*6994f6b1SLoGin     /// 创建一个新的静态位图
21*6994f6b1SLoGin     pub const fn new() -> Self {
22*6994f6b1SLoGin         Self {
23*6994f6b1SLoGin             data: [0; (N + usize::BITS as usize - 1) / (usize::BITS as usize)],
24*6994f6b1SLoGin             core: BitMapCore::new(),
25*6994f6b1SLoGin         }
26*6994f6b1SLoGin     }
27*6994f6b1SLoGin }
28*6994f6b1SLoGin 
29*6994f6b1SLoGin impl<const N: usize> BitMapOps<usize> for StaticBitmap<N>
30*6994f6b1SLoGin where
31*6994f6b1SLoGin     [(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
32*6994f6b1SLoGin {
33*6994f6b1SLoGin     #[inline]
34*6994f6b1SLoGin     fn get(&self, index: usize) -> Option<bool> {
35*6994f6b1SLoGin         return self.core.get(&self.data, index);
36*6994f6b1SLoGin     }
37*6994f6b1SLoGin 
38*6994f6b1SLoGin     #[inline]
39*6994f6b1SLoGin     fn set(&mut self, index: usize, value: bool) -> Option<bool> {
40*6994f6b1SLoGin         return self.core.set(&mut self.data, index, value);
41*6994f6b1SLoGin     }
42*6994f6b1SLoGin 
43*6994f6b1SLoGin     #[inline]
44*6994f6b1SLoGin     fn len(&self) -> usize {
45*6994f6b1SLoGin         N
46*6994f6b1SLoGin     }
47*6994f6b1SLoGin 
48*6994f6b1SLoGin     #[inline]
49*6994f6b1SLoGin     fn size(&self) -> usize {
50*6994f6b1SLoGin         self.data.len() * size_of::<usize>()
51*6994f6b1SLoGin     }
52*6994f6b1SLoGin 
53*6994f6b1SLoGin     #[inline]
54*6994f6b1SLoGin     fn first_index(&self) -> Option<usize> {
55*6994f6b1SLoGin         self.core.first_index(&self.data)
56*6994f6b1SLoGin     }
57*6994f6b1SLoGin 
58*6994f6b1SLoGin     #[inline]
59*6994f6b1SLoGin     fn first_false_index(&self) -> Option<usize> {
60*6994f6b1SLoGin         self.core.first_false_index(&self.data)
61*6994f6b1SLoGin     }
62*6994f6b1SLoGin 
63*6994f6b1SLoGin     #[inline]
64*6994f6b1SLoGin     fn last_index(&self) -> Option<usize> {
65*6994f6b1SLoGin         self.core.last_index(&self.data)
66*6994f6b1SLoGin     }
67*6994f6b1SLoGin 
68*6994f6b1SLoGin     #[inline]
69*6994f6b1SLoGin     fn last_false_index(&self) -> Option<usize> {
70*6994f6b1SLoGin         self.core.last_false_index(&self.data)
71*6994f6b1SLoGin     }
72*6994f6b1SLoGin 
73*6994f6b1SLoGin     #[inline]
74*6994f6b1SLoGin     fn next_index(&self, index: usize) -> Option<usize> {
75*6994f6b1SLoGin         self.core.next_index(&self.data, index)
76*6994f6b1SLoGin     }
77*6994f6b1SLoGin 
78*6994f6b1SLoGin     #[inline]
79*6994f6b1SLoGin     fn next_false_index(&self, index: usize) -> Option<usize> {
80*6994f6b1SLoGin         self.core.next_false_index(&self.data, index)
81*6994f6b1SLoGin     }
82*6994f6b1SLoGin 
83*6994f6b1SLoGin     #[inline]
84*6994f6b1SLoGin     fn prev_index(&self, index: usize) -> Option<usize> {
85*6994f6b1SLoGin         self.core.prev_index(&self.data, index)
86*6994f6b1SLoGin     }
87*6994f6b1SLoGin 
88*6994f6b1SLoGin     #[inline]
89*6994f6b1SLoGin     fn prev_false_index(&self, index: usize) -> Option<usize> {
90*6994f6b1SLoGin         self.core.prev_false_index(&self.data, index)
91*6994f6b1SLoGin     }
92*6994f6b1SLoGin 
93*6994f6b1SLoGin     #[inline]
94*6994f6b1SLoGin     fn invert(&mut self) {
95*6994f6b1SLoGin         self.core.invert(&mut self.data);
96*6994f6b1SLoGin     }
97*6994f6b1SLoGin 
98*6994f6b1SLoGin     #[inline]
99*6994f6b1SLoGin     fn is_full(&self) -> bool {
100*6994f6b1SLoGin         self.core.is_full(&self.data)
101*6994f6b1SLoGin     }
102*6994f6b1SLoGin 
103*6994f6b1SLoGin     #[inline]
104*6994f6b1SLoGin     fn is_empty(&self) -> bool {
105*6994f6b1SLoGin         self.core.is_empty(&self.data)
106*6994f6b1SLoGin     }
107*6994f6b1SLoGin 
108*6994f6b1SLoGin     #[inline]
109*6994f6b1SLoGin     unsafe fn as_bytes(&self) -> &[u8] {
110*6994f6b1SLoGin         core::slice::from_raw_parts(
111*6994f6b1SLoGin             self.data.as_ptr() as *const u8,
112*6994f6b1SLoGin             core::mem::size_of::<Self>(),
113*6994f6b1SLoGin         )
114*6994f6b1SLoGin     }
115*6994f6b1SLoGin 
116*6994f6b1SLoGin     fn set_all(&mut self, value: bool) {
117*6994f6b1SLoGin         self.core.set_all(&mut self.data, value);
118*6994f6b1SLoGin     }
119*6994f6b1SLoGin }
120