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