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