xref: /DragonOS/kernel/crates/bitmap/src/static_bitmap.rs (revision 52da9a59374752b4d01907b052135a0d317781dd)
16994f6b1SLoGin use core::mem::size_of;
26994f6b1SLoGin 
36994f6b1SLoGin use crate::{bitmap_core::BitMapCore, traits::BitMapOps};
46994f6b1SLoGin 
56994f6b1SLoGin /// 静态位图
66994f6b1SLoGin ///
76994f6b1SLoGin /// 该位图的大小在编译时确定,不可变
8*52da9a59SGnoCiYeH #[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 
176994f6b1SLoGin impl<const N: usize> StaticBitmap<N>
186994f6b1SLoGin where
196994f6b1SLoGin     [(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
206994f6b1SLoGin {
216994f6b1SLoGin     /// 创建一个新的静态位图
226994f6b1SLoGin     pub const fn new() -> Self {
236994f6b1SLoGin         Self {
246994f6b1SLoGin             data: [0; (N + usize::BITS as usize - 1) / (usize::BITS as usize)],
256994f6b1SLoGin             core: BitMapCore::new(),
266994f6b1SLoGin         }
276994f6b1SLoGin     }
286994f6b1SLoGin }
296994f6b1SLoGin 
306994f6b1SLoGin impl<const N: usize> BitMapOps<usize> for StaticBitmap<N>
316994f6b1SLoGin where
326994f6b1SLoGin     [(); (N + usize::BITS as usize - 1) / (usize::BITS as usize)]:,
336994f6b1SLoGin {
346994f6b1SLoGin     #[inline]
356994f6b1SLoGin     fn get(&self, index: usize) -> Option<bool> {
36b2ca6800SLoGin         return self.core.get(N, &self.data, index);
376994f6b1SLoGin     }
386994f6b1SLoGin 
396994f6b1SLoGin     #[inline]
406994f6b1SLoGin     fn set(&mut self, index: usize, value: bool) -> Option<bool> {
41b2ca6800SLoGin         return self.core.set(N, &mut self.data, index, value);
426994f6b1SLoGin     }
436994f6b1SLoGin 
446994f6b1SLoGin     #[inline]
456994f6b1SLoGin     fn len(&self) -> usize {
466994f6b1SLoGin         N
476994f6b1SLoGin     }
486994f6b1SLoGin 
496994f6b1SLoGin     #[inline]
506994f6b1SLoGin     fn size(&self) -> usize {
516994f6b1SLoGin         self.data.len() * size_of::<usize>()
526994f6b1SLoGin     }
536994f6b1SLoGin 
546994f6b1SLoGin     #[inline]
556994f6b1SLoGin     fn first_index(&self) -> Option<usize> {
566994f6b1SLoGin         self.core.first_index(&self.data)
576994f6b1SLoGin     }
586994f6b1SLoGin 
596994f6b1SLoGin     #[inline]
606994f6b1SLoGin     fn first_false_index(&self) -> Option<usize> {
61b2ca6800SLoGin         self.core.first_false_index(N, &self.data)
626994f6b1SLoGin     }
636994f6b1SLoGin 
646994f6b1SLoGin     #[inline]
656994f6b1SLoGin     fn last_index(&self) -> Option<usize> {
66b2ca6800SLoGin         self.core.last_index(N, &self.data)
676994f6b1SLoGin     }
686994f6b1SLoGin 
696994f6b1SLoGin     #[inline]
706994f6b1SLoGin     fn last_false_index(&self) -> Option<usize> {
71b2ca6800SLoGin         self.core.last_false_index(N, &self.data)
726994f6b1SLoGin     }
736994f6b1SLoGin 
746994f6b1SLoGin     #[inline]
756994f6b1SLoGin     fn next_index(&self, index: usize) -> Option<usize> {
76b2ca6800SLoGin         self.core.next_index(N, &self.data, index)
776994f6b1SLoGin     }
786994f6b1SLoGin 
796994f6b1SLoGin     #[inline]
806994f6b1SLoGin     fn next_false_index(&self, index: usize) -> Option<usize> {
81b2ca6800SLoGin         self.core.next_false_index(N, &self.data, index)
826994f6b1SLoGin     }
836994f6b1SLoGin 
846994f6b1SLoGin     #[inline]
856994f6b1SLoGin     fn prev_index(&self, index: usize) -> Option<usize> {
86b2ca6800SLoGin         self.core.prev_index(N, &self.data, index)
876994f6b1SLoGin     }
886994f6b1SLoGin 
896994f6b1SLoGin     #[inline]
906994f6b1SLoGin     fn prev_false_index(&self, index: usize) -> Option<usize> {
91b2ca6800SLoGin         self.core.prev_false_index(N, &self.data, index)
926994f6b1SLoGin     }
936994f6b1SLoGin 
946994f6b1SLoGin     #[inline]
956994f6b1SLoGin     fn invert(&mut self) {
96b2ca6800SLoGin         self.core.invert(N, &mut self.data);
976994f6b1SLoGin     }
986994f6b1SLoGin 
996994f6b1SLoGin     #[inline]
1006994f6b1SLoGin     fn is_full(&self) -> bool {
101b2ca6800SLoGin         self.core.is_full(N, &self.data)
1026994f6b1SLoGin     }
1036994f6b1SLoGin 
1046994f6b1SLoGin     #[inline]
1056994f6b1SLoGin     fn is_empty(&self) -> bool {
1066994f6b1SLoGin         self.core.is_empty(&self.data)
1076994f6b1SLoGin     }
1086994f6b1SLoGin 
1096994f6b1SLoGin     #[inline]
1106994f6b1SLoGin     unsafe fn as_bytes(&self) -> &[u8] {
1116994f6b1SLoGin         core::slice::from_raw_parts(
1126994f6b1SLoGin             self.data.as_ptr() as *const u8,
1136994f6b1SLoGin             core::mem::size_of::<Self>(),
1146994f6b1SLoGin         )
1156994f6b1SLoGin     }
1166994f6b1SLoGin 
1176994f6b1SLoGin     fn set_all(&mut self, value: bool) {
118b2ca6800SLoGin         self.core.set_all(N, &mut self.data, value);
1196994f6b1SLoGin     }
1206994f6b1SLoGin }
121