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