xref: /DragonOS/kernel/crates/bitmap/src/static_bitmap.rs (revision bd70d2d1f490aabd570a5301b858bd5eb04149fa)
16994f6b1SLoGin use core::mem::size_of;
26994f6b1SLoGin 
36994f6b1SLoGin use crate::{bitmap_core::BitMapCore, traits::BitMapOps};
46994f6b1SLoGin 
56994f6b1SLoGin /// 静态位图
66994f6b1SLoGin ///
76994f6b1SLoGin /// 该位图的大小在编译时确定,不可变
852da9a59SGnoCiYeH #[derive(Debug, Clone)]
96994f6b1SLoGin pub struct StaticBitmap<const N: usize>
106994f6b1SLoGin where
116994f6b1SLoGin     [(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
126994f6b1SLoGin {
136994f6b1SLoGin     pub data: [usize; (N + usize::BITS as usize - 1) / (usize::BITS as usize)],
14b2ca6800SLoGin     core: BitMapCore<usize>,
156994f6b1SLoGin }
166994f6b1SLoGin 
17*bd70d2d1SLoGin impl<const N: usize> Default for StaticBitmap<N>
18*bd70d2d1SLoGin where
19*bd70d2d1SLoGin     [(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
20*bd70d2d1SLoGin {
default() -> Self21*bd70d2d1SLoGin     fn default() -> Self {
22*bd70d2d1SLoGin         Self::new()
23*bd70d2d1SLoGin     }
24*bd70d2d1SLoGin }
25*bd70d2d1SLoGin 
266994f6b1SLoGin impl<const N: usize> StaticBitmap<N>
276994f6b1SLoGin where
286994f6b1SLoGin     [(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
296994f6b1SLoGin {
306994f6b1SLoGin     /// 创建一个新的静态位图
new() -> Self316994f6b1SLoGin     pub const fn new() -> Self {
326994f6b1SLoGin         Self {
336994f6b1SLoGin             data: [0; (N + usize::BITS as usize - 1) / (usize::BITS as usize)],
346994f6b1SLoGin             core: BitMapCore::new(),
356994f6b1SLoGin         }
366994f6b1SLoGin     }
376994f6b1SLoGin }
386994f6b1SLoGin 
396994f6b1SLoGin impl<const N: usize> BitMapOps<usize> for StaticBitmap<N>
406994f6b1SLoGin where
416994f6b1SLoGin     [(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
426994f6b1SLoGin {
436994f6b1SLoGin     #[inline]
get(&self, index: usize) -> Option<bool>446994f6b1SLoGin     fn get(&self, index: usize) -> Option<bool> {
45b2ca6800SLoGin         return self.core.get(N, &self.data, index);
466994f6b1SLoGin     }
476994f6b1SLoGin 
486994f6b1SLoGin     #[inline]
set(&mut self, index: usize, value: bool) -> Option<bool>496994f6b1SLoGin     fn set(&mut self, index: usize, value: bool) -> Option<bool> {
50b2ca6800SLoGin         return self.core.set(N, &mut self.data, index, value);
516994f6b1SLoGin     }
526994f6b1SLoGin 
536994f6b1SLoGin     #[inline]
len(&self) -> usize546994f6b1SLoGin     fn len(&self) -> usize {
556994f6b1SLoGin         N
566994f6b1SLoGin     }
576994f6b1SLoGin 
586994f6b1SLoGin     #[inline]
size(&self) -> usize596994f6b1SLoGin     fn size(&self) -> usize {
606994f6b1SLoGin         self.data.len() * size_of::<usize>()
616994f6b1SLoGin     }
626994f6b1SLoGin 
636994f6b1SLoGin     #[inline]
first_index(&self) -> Option<usize>646994f6b1SLoGin     fn first_index(&self) -> Option<usize> {
656994f6b1SLoGin         self.core.first_index(&self.data)
666994f6b1SLoGin     }
676994f6b1SLoGin 
686994f6b1SLoGin     #[inline]
first_false_index(&self) -> Option<usize>696994f6b1SLoGin     fn first_false_index(&self) -> Option<usize> {
70b2ca6800SLoGin         self.core.first_false_index(N, &self.data)
716994f6b1SLoGin     }
726994f6b1SLoGin 
736994f6b1SLoGin     #[inline]
last_index(&self) -> Option<usize>746994f6b1SLoGin     fn last_index(&self) -> Option<usize> {
75b2ca6800SLoGin         self.core.last_index(N, &self.data)
766994f6b1SLoGin     }
776994f6b1SLoGin 
786994f6b1SLoGin     #[inline]
last_false_index(&self) -> Option<usize>796994f6b1SLoGin     fn last_false_index(&self) -> Option<usize> {
80b2ca6800SLoGin         self.core.last_false_index(N, &self.data)
816994f6b1SLoGin     }
826994f6b1SLoGin 
836994f6b1SLoGin     #[inline]
next_index(&self, index: usize) -> Option<usize>846994f6b1SLoGin     fn next_index(&self, index: usize) -> Option<usize> {
85b2ca6800SLoGin         self.core.next_index(N, &self.data, index)
866994f6b1SLoGin     }
876994f6b1SLoGin 
886994f6b1SLoGin     #[inline]
next_false_index(&self, index: usize) -> Option<usize>896994f6b1SLoGin     fn next_false_index(&self, index: usize) -> Option<usize> {
90b2ca6800SLoGin         self.core.next_false_index(N, &self.data, index)
916994f6b1SLoGin     }
926994f6b1SLoGin 
936994f6b1SLoGin     #[inline]
prev_index(&self, index: usize) -> Option<usize>946994f6b1SLoGin     fn prev_index(&self, index: usize) -> Option<usize> {
95b2ca6800SLoGin         self.core.prev_index(N, &self.data, index)
966994f6b1SLoGin     }
976994f6b1SLoGin 
986994f6b1SLoGin     #[inline]
prev_false_index(&self, index: usize) -> Option<usize>996994f6b1SLoGin     fn prev_false_index(&self, index: usize) -> Option<usize> {
100b2ca6800SLoGin         self.core.prev_false_index(N, &self.data, index)
1016994f6b1SLoGin     }
1026994f6b1SLoGin 
1036994f6b1SLoGin     #[inline]
invert(&mut self)1046994f6b1SLoGin     fn invert(&mut self) {
105b2ca6800SLoGin         self.core.invert(N, &mut self.data);
1066994f6b1SLoGin     }
1076994f6b1SLoGin 
1086994f6b1SLoGin     #[inline]
is_full(&self) -> bool1096994f6b1SLoGin     fn is_full(&self) -> bool {
110b2ca6800SLoGin         self.core.is_full(N, &self.data)
1116994f6b1SLoGin     }
1126994f6b1SLoGin 
1136994f6b1SLoGin     #[inline]
is_empty(&self) -> bool1146994f6b1SLoGin     fn is_empty(&self) -> bool {
1156994f6b1SLoGin         self.core.is_empty(&self.data)
1166994f6b1SLoGin     }
1176994f6b1SLoGin 
1186994f6b1SLoGin     #[inline]
as_bytes(&self) -> &[u8]1196994f6b1SLoGin     unsafe fn as_bytes(&self) -> &[u8] {
1206994f6b1SLoGin         core::slice::from_raw_parts(
1216994f6b1SLoGin             self.data.as_ptr() as *const u8,
1226994f6b1SLoGin             core::mem::size_of::<Self>(),
1236994f6b1SLoGin         )
1246994f6b1SLoGin     }
1256994f6b1SLoGin 
set_all(&mut self, value: bool)1266994f6b1SLoGin     fn set_all(&mut self, value: bool) {
127b2ca6800SLoGin         self.core.set_all(N, &mut self.data, value);
1286994f6b1SLoGin     }
1296994f6b1SLoGin }
130