bitmap_core.rs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. use core::{intrinsics::unlikely, marker::PhantomData};
  2. use crate::traits::BitOps;
  3. #[derive(Debug, Clone)]
  4. pub(crate) struct BitMapCore<T: BitOps> {
  5. phantom: PhantomData<T>,
  6. }
  7. impl<T: BitOps> BitMapCore<T> {
  8. pub const fn new() -> Self {
  9. Self {
  10. phantom: PhantomData,
  11. }
  12. }
  13. /// 获取位图中的某一位
  14. pub(crate) fn get(&self, n: usize, data: &[T], index: usize) -> Option<bool> {
  15. if unlikely(index >= n) {
  16. return None;
  17. }
  18. let element_index = index / T::bit_size();
  19. let bit_index = index % T::bit_size();
  20. let element = data.get(element_index)?;
  21. let bit = <T as BitOps>::get(element, bit_index);
  22. Some(bit)
  23. }
  24. /// 设置位图中的某一位
  25. pub(crate) fn set(&self, n: usize, data: &mut [T], index: usize, value: bool) -> Option<bool> {
  26. if unlikely(index >= n) {
  27. return None;
  28. }
  29. let element_index = index / T::bit_size();
  30. let bit_index = index % T::bit_size();
  31. let element = data.get_mut(element_index)?;
  32. let bit = <T as BitOps>::set(element, bit_index, value);
  33. Some(bit)
  34. }
  35. pub(crate) fn set_all(&self, n: usize, data: &mut [T], value: bool) {
  36. let val = if value { T::max() } else { T::zero() };
  37. for element in data.iter_mut() {
  38. *element = val;
  39. }
  40. // 特殊处理最后一个元素
  41. let last_element = data.last_mut().unwrap();
  42. let mask = T::make_mask(n % T::bit_size());
  43. if mask != T::zero() {
  44. *last_element &= mask;
  45. }
  46. }
  47. /// 获取位图中第一个为1的位
  48. pub(crate) fn first_index(&self, data: &[T]) -> Option<usize> {
  49. for (i, element) in data.iter().enumerate() {
  50. let bit = <T as BitOps>::first_index(element);
  51. if let Some(b) = bit {
  52. return Some(i * T::bit_size() + b);
  53. }
  54. }
  55. None
  56. }
  57. /// 获取位图中第一个为0的位
  58. pub(crate) fn first_false_index(&self, n: usize, data: &[T]) -> Option<usize> {
  59. for (i, element) in data.iter().enumerate() {
  60. if let Some(bit) = <T as BitOps>::first_false_index(element) {
  61. return self.make_index(n, i * T::bit_size() + bit);
  62. }
  63. }
  64. None
  65. }
  66. /// 获取位图中最后一个为1的位
  67. pub(crate) fn last_index(&self, n: usize, data: &[T]) -> Option<usize> {
  68. for (i, element) in data.iter().enumerate().rev() {
  69. if let Some(bit) = <T as BitOps>::last_index(element) {
  70. return self.make_index(n, i * T::bit_size() + bit);
  71. }
  72. }
  73. None
  74. }
  75. /// 获取位图中最后一个为0的位
  76. ///
  77. /// ## 参数
  78. ///
  79. /// - `data`:位图数据
  80. /// - `n`:位图有效位数
  81. pub(crate) fn last_false_index(&self, n: usize, data: &[T]) -> Option<usize> {
  82. let mut iter = data.iter().rev();
  83. let mut last_element = *iter.next()?;
  84. // 对最后一个元素进行特殊处理,因为最后一个元素可能不是满的
  85. let mut mask = T::make_mask(n % T::bit_size());
  86. if mask != T::zero() {
  87. <T as BitOps>::invert(&mut mask);
  88. last_element |= mask;
  89. }
  90. if let Some(bit) = <T as BitOps>::last_false_index(&last_element) {
  91. return self.make_index(n, (data.len() - 1) * T::bit_size() + bit);
  92. }
  93. for element in iter {
  94. if let Some(bit) = <T as BitOps>::last_false_index(element) {
  95. return self.make_index(n, (data.len() - 1) * T::bit_size() + bit);
  96. }
  97. }
  98. None
  99. }
  100. /// 获取位图中下一个为1的位
  101. pub(crate) fn next_index(&self, n: usize, data: &[T], index: usize) -> Option<usize> {
  102. if unlikely(index >= n) {
  103. return None;
  104. }
  105. let element_index = index / T::bit_size();
  106. let bit_index = index % T::bit_size();
  107. let element = data.get(element_index)?;
  108. if let Some(bit) = <T as BitOps>::next_index(element, bit_index) {
  109. return self.make_index(n, element_index * T::bit_size() + bit);
  110. }
  111. for (i, element) in data.iter().enumerate().skip(element_index + 1) {
  112. if let Some(bit) = <T as BitOps>::first_index(element) {
  113. return self.make_index(n, i * T::bit_size() + bit);
  114. }
  115. }
  116. None
  117. }
  118. /// 获取位图中下一个为0的位
  119. pub(crate) fn next_false_index(&self, n: usize, data: &[T], index: usize) -> Option<usize> {
  120. if unlikely(index >= n) {
  121. return None;
  122. }
  123. let element_index = index / T::bit_size();
  124. let bit_index = index % T::bit_size();
  125. let element = data.get(element_index)?;
  126. if let Some(bit) = <T as BitOps>::next_false_index(element, bit_index) {
  127. return self.make_index(n, element_index * T::bit_size() + bit);
  128. }
  129. for (i, element) in data.iter().enumerate().skip(element_index + 1) {
  130. if let Some(bit) = <T as BitOps>::first_false_index(element) {
  131. return self.make_index(n, i * T::bit_size() + bit);
  132. }
  133. }
  134. None
  135. }
  136. /// 获取位图中上一个为1的位
  137. pub(crate) fn prev_index(&self, n: usize, data: &[T], index: usize) -> Option<usize> {
  138. if unlikely(index >= n) {
  139. return None;
  140. }
  141. let element_index = index / T::bit_size();
  142. let bit_index = index % T::bit_size();
  143. let element = data.get(element_index)?;
  144. if let Some(bit) = <T as BitOps>::prev_index(element, bit_index) {
  145. return self.make_index(n, element_index * T::bit_size() + bit);
  146. }
  147. for (i, element) in data.iter().enumerate().take(element_index).rev() {
  148. if let Some(bit) = <T as BitOps>::last_index(element) {
  149. return self.make_index(n, i * T::bit_size() + bit);
  150. }
  151. }
  152. None
  153. }
  154. pub(crate) fn prev_false_index(&self, n: usize, data: &[T], index: usize) -> Option<usize> {
  155. let element_index = index / T::bit_size();
  156. let bit_index = index % T::bit_size();
  157. let element = data.get(element_index)?;
  158. if let Some(bit) = <T as BitOps>::prev_false_index(element, bit_index) {
  159. return self.make_index(n, element_index * T::bit_size() + bit);
  160. }
  161. for (i, element) in data.iter().enumerate().take(element_index).rev() {
  162. if let Some(bit) = <T as BitOps>::last_false_index(element) {
  163. return self.make_index(n, i * T::bit_size() + bit);
  164. }
  165. }
  166. None
  167. }
  168. pub(crate) fn invert(&self, n: usize, data: &mut [T]) {
  169. for element in data.iter_mut() {
  170. <T as BitOps>::invert(element);
  171. }
  172. // 特殊处理最后一个元素
  173. let last_element = data.last_mut().unwrap();
  174. let mask = T::make_mask(n % T::bit_size());
  175. if mask != T::zero() {
  176. *last_element &= mask;
  177. }
  178. }
  179. pub(crate) fn is_full(&self, n: usize, data: &[T]) -> bool {
  180. let mut iter = data.iter().peekable();
  181. while let Some(element) = iter.next() {
  182. if iter.peek().is_none() {
  183. // 这是最后一个元素,进行特殊处理
  184. let mut element = *element;
  185. let mut mask = T::make_mask(n % T::bit_size());
  186. if mask == T::zero() {
  187. mask = T::max();
  188. }
  189. T::bit_and(&mut element, &mask);
  190. if element == mask {
  191. return true;
  192. }
  193. } else if element != &T::make_mask(T::bit_size()) {
  194. return false;
  195. }
  196. }
  197. return false;
  198. }
  199. pub(crate) fn is_empty(&self, data: &[T]) -> bool {
  200. for element in data.iter() {
  201. if element != &T::zero() {
  202. return false;
  203. }
  204. }
  205. return true;
  206. }
  207. fn make_index(&self, n: usize, index: usize) -> Option<usize> {
  208. if unlikely(index >= n) {
  209. return None;
  210. }
  211. Some(index)
  212. }
  213. }