crab_vault_utils/bitmap.rs
1//! # 位图模块
2//!
3//! 这个模块提供了一个通用的 [`Bitmap`] 结构,用于高效地进行位操作。
4//!
5//! [`Bitmap`] 由一个实现了 [`BitStorage`] trait 的泛型整数类型(如 `u8`, `u16`, `u32`, `u64`, `u128`)支持。
6//! 它封装了底层的位运算,提供了创建、修改、查询位图以及在置位 (1) 和未置位 (0) 的位上进行迭代的功能。
7//!
8//! ## 主要功能
9//!
10//! - **泛型实现**: 可以使用任何常见的无符号整数作为底层存储。
11//! - **完整的位运算**: 支持 `&`, `|`, `^`, `!` 等所有标准位运算符。
12//! - **迭代器**: 提供 [`PositiveIter`] 和 [`NegativeIter`],分别用于遍历值为 1 和 0 的位的索引。
13//! - **丰富的 API**: 包含 [`set`](Bitmap::set), [`get`](Bitmap::get), [`count_ones`](Bitmap::count_ones), [`any`](Bitmap::any), [`all`](Bitmap::all), [`none`](Bitmap::none) 等常用方法。
14//!
15//! ## 示例
16//!
17//! ```
18//! # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
19//! // 使用 u32 作为存储,创建一个 32 位的位图
20//! let mut artists = Bitmap::<u32>::new();
21//!
22//! // 将索引为 2, 8, 9 的位设置为 1
23//! artists.set(2, true);
24//! artists.set(8, true);
25//! artists.set(9, true);
26//!
27//! // 检查索引为 8 的位是否为 1
28//! assert!(artists.get(8));
29//! // 检查索引为 5 的位是否为 0
30//! assert!(!artists.get(5));
31//!
32//! // 计算有多少个位被设置了
33//! assert_eq!(artists.count_ones(), 3);
34//!
35//! // 使用迭代器收集所有值为 1 的位的索引
36//! let set_bits: Vec<usize> = artists.iter_ones().collect();
37//! assert_eq!(set_bits, vec![2, 8, 9]);
38//!
39//! // 创建另一个位图并进行合并
40//! let mut other_artists = Bitmap::<u32>::new();
41//! other_artists.set(9, true);
42//! other_artists.set(15, true);
43//!
44//! let all_artists = artists | other_artists;
45//! let expected_bits: Vec<usize> = all_artists.iter_ones().collect();
46//! assert_eq!(expected_bits, vec![2, 8, 9, 15]);
47//! ```
48
49use std::fmt::Debug;
50use std::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not, Shl, Shr};
51
52pub trait BitStorage:
53 Copy
54 + Default
55 + Debug
56 + BitAnd<Output = Self>
57 + BitAndAssign
58 + BitOr<Output = Self>
59 + BitOrAssign
60 + BitXor<Output = Self>
61 + BitXorAssign
62 + Not<Output = Self>
63 + From<u8>
64 + Shl<usize, Output = Self>
65 + Shr<usize, Output = Self>
66 + PartialEq
67 + Eq
68{
69 const BITS: usize;
70 fn trailing_zeros(self) -> u32;
71 fn count_ones(self) -> u32;
72 fn count_zeros(self) -> u32;
73}
74
75macro_rules! impl_bit_storage_for_basic_types {
76 ($($storage_type: ty), *) => {
77 $(
78 impl BitStorage for $storage_type {
79 const BITS: usize = std::mem::size_of::<$storage_type>() * 8;
80
81 #[inline]
82 fn trailing_zeros(self) -> u32 {
83 self.trailing_zeros()
84 }
85
86 #[inline]
87 fn count_ones(self) -> u32 {
88 self.count_ones()
89 }
90
91 #[inline]
92 fn count_zeros(self) -> u32 {
93 self.count_zeros()
94 }
95 }
96 )*
97 };
98}
99
100impl_bit_storage_for_basic_types!(u8, u16, u32, u64, u128);
101
102/// 一个通用的位图结构,由一个实现了 [`BitStorage`] 的类型支持。
103///
104/// # 示例
105/// ```
106/// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
107/// // 使用 u16 作为存储类型,总共 16 位
108/// let mut bitmap = Bitmap::<u16>::new();
109/// bitmap.set(3, true);
110/// bitmap.set(5, true);
111///
112/// assert!(bitmap.get(3));
113/// assert!(!bitmap.get(4));
114///
115/// let positions: Vec<usize> = bitmap.iter_ones().collect();
116/// assert_eq!(positions, vec![3, 5]);
117/// ```
118#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
119pub struct Bitmap<T: BitStorage> {
120 inner: T,
121}
122
123/// 一个迭代器,用于遍历位图中所有值为 1 (positive) 的位索引。
124pub struct PositiveIter<T: BitStorage> {
125 bitmap: Bitmap<T>,
126}
127
128/// 一个迭代器,用于遍历位图中所有值为 0 (negative) 的位索引。
129pub struct NegativeIter<T: BitStorage> {
130 bitmap: Bitmap<T>,
131}
132
133impl<T: BitStorage> From<NegativeIter<T>> for PositiveIter<T> {
134 fn from(NegativeIter { bitmap }: NegativeIter<T>) -> Self {
135 Self { bitmap }
136 }
137}
138
139impl<T: BitStorage> From<PositiveIter<T>> for NegativeIter<T> {
140 fn from(PositiveIter { bitmap }: PositiveIter<T>) -> Self {
141 Self { bitmap }
142 }
143}
144
145impl<T: BitStorage> Iterator for PositiveIter<T> {
146 type Item = usize;
147
148 fn next(&mut self) -> Option<Self::Item> {
149 if self.bitmap.inner == T::from(0) {
150 return None;
151 }
152
153 let next_bit_pos = self.bitmap.inner.trailing_zeros() as usize;
154
155 // 清除刚刚找到的位,以便下一次迭代
156 let mask = T::from(1) << next_bit_pos;
157 self.bitmap.inner &= !mask;
158 Some(next_bit_pos)
159 }
160}
161
162impl<T: BitStorage> Iterator for NegativeIter<T> {
163 type Item = usize;
164
165 fn next(&mut self) -> Option<Self::Item> {
166 // 如果所有位都为 1,则没有 0 可以迭代
167 if self.bitmap.inner == !T::from(0) {
168 return None;
169 }
170
171 let next_bit_pos = (!self.bitmap.inner).trailing_zeros() as usize;
172
173 // 设置刚刚找到的位为 1,以便下一次迭代
174 let mask = T::from(1) << next_bit_pos;
175 self.bitmap.inner |= mask;
176 Some(next_bit_pos)
177 }
178}
179
180impl<T: BitStorage> PositiveIter<T> {
181 /// 将正迭代器(遍历 1)转换为负迭代器(遍历 0)。
182 ///
183 /// # 示例
184 /// ```
185 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
186 /// let mut bitmap = Bitmap::<u8>::new();
187 /// bitmap.set(1, true);
188 /// bitmap.set(3, true);
189 ///
190 /// let positive_iter = bitmap.iter_ones();
191 /// let negative_iter = positive_iter.invert();
192 /// let zeros: Vec<usize> = negative_iter.collect();
193 ///
194 /// assert_eq!(zeros, vec![0, 2, 4, 5, 6, 7]);
195 /// ```
196 #[inline]
197 pub fn invert(self) -> NegativeIter<T> {
198 self.into()
199 }
200}
201
202impl<T: BitStorage> NegativeIter<T> {
203 /// 将负迭代器(遍历 0)转换为正迭代器(遍历 1)。
204 ///
205 /// # 示例
206 /// ```
207 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
208 /// let mut bitmap = Bitmap::<u8>::new_full();
209 /// bitmap.set(1, false);
210 /// bitmap.set(3, false);
211 ///
212 /// let negative_iter = bitmap.iter_zeros();
213 /// let positive_iter = negative_iter.invert();
214 /// let ones: Vec<usize> = positive_iter.collect();
215 ///
216 /// assert_eq!(ones, vec![0, 2, 4, 5, 6, 7]);
217 /// ```
218 #[inline]
219 pub fn invert(self) -> PositiveIter<T> {
220 self.into()
221 }
222}
223
224impl<T: BitStorage> IntoIterator for &Bitmap<T> {
225 type Item = usize;
226 type IntoIter = PositiveIter<T>;
227
228 #[inline]
229 fn into_iter(self) -> Self::IntoIter {
230 self.iter_ones()
231 }
232}
233
234impl<T: BitStorage> IntoIterator for Bitmap<T> {
235 type Item = usize;
236 type IntoIter = PositiveIter<T>;
237
238 #[inline]
239 fn into_iter(self) -> Self::IntoIter {
240 self.iter_ones()
241 }
242}
243
244impl<T: BitStorage> From<T> for Bitmap<T> {
245 #[inline]
246 fn from(val: T) -> Self {
247 Self { inner: val }
248 }
249}
250
251impl<T: BitStorage> Bitmap<T> {
252 /// 创建一个所有位都为 0 的空位图。
253 ///
254 /// # 示例
255 /// ```
256 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
257 /// let bitmap = Bitmap::<u16>::new_empty();
258 /// assert!(bitmap.none());
259 /// assert_eq!(bitmap.count_ones(), 0);
260 /// ```
261 #[inline]
262 pub fn new_empty() -> Self {
263 Self { inner: T::from(0) }
264 }
265
266 /// 创建一个所有位都为 1 的全满位图。
267 ///
268 /// # 示例
269 /// ```
270 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
271 /// let bitmap = Bitmap::<u8>::new_full();
272 /// assert!(bitmap.all());
273 /// assert_eq!(bitmap.count_ones(), 8);
274 /// ```
275 #[inline]
276 pub fn new_full() -> Self {
277 Self { inner: !T::from(0) }
278 }
279
280 /// 创建一个空的位图,是 `new_empty` 的别名。
281 ///
282 /// # 示例
283 /// ```
284 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
285 /// let bitmap = Bitmap::<u32>::new();
286 /// assert!(bitmap.none());
287 /// ```
288 #[inline]
289 pub fn new() -> Self {
290 Self::new_empty()
291 }
292
293 /// 返回一个迭代器,用于遍历所有值为 1 的位的索引。
294 ///
295 /// # 示例
296 /// ```
297 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
298 /// let mut bitmap = Bitmap::<u8>::new();
299 /// bitmap.set(2, true);
300 /// bitmap.set(6, true);
301 /// let ones: Vec<usize> = bitmap.iter_ones().collect();
302 /// assert_eq!(ones, vec![2, 6]);
303 /// ```
304 #[inline]
305 pub const fn iter_ones(&self) -> PositiveIter<T> {
306 PositiveIter { bitmap: *self }
307 }
308
309 /// 返回一个迭代器,用于遍历所有值为 0 的位的索引。
310 ///
311 /// # 示例
312 /// ```
313 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
314 /// let mut bitmap = Bitmap::<u8>::new();
315 /// bitmap.set(0, true);
316 /// bitmap.set(1, true);
317 /// bitmap.set(2, true);
318 /// bitmap.set(3, true);
319 /// // 内部值为 ...00001111
320 /// let zeros: Vec<usize> = bitmap.iter_zeros().collect();
321 /// assert_eq!(zeros, vec![4, 5, 6, 7]);
322 /// ```
323 #[inline]
324 pub const fn iter_zeros(&self) -> NegativeIter<T> {
325 NegativeIter { bitmap: *self }
326 }
327
328 /// 设置指定索引的位。
329 ///
330 /// `true` 表示设置为 1,`false` 表示设置为 0。
331 ///
332 /// # Panics
333 ///
334 /// 如果 `idx` 超出位图的范围(`idx >= T::BITS`),在调试模式下会触发 panic。
335 ///
336 /// # 示例
337 /// ```
338 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
339 /// let mut bitmap = Bitmap::<u8>::new();
340 /// bitmap.set(5, true);
341 /// assert!(bitmap.get(5));
342 /// bitmap.set(5, false);
343 /// assert!(!bitmap.get(5));
344 /// ```
345 #[inline]
346 pub fn set(&mut self, idx: usize, set: bool) {
347 debug_assert!(idx < T::BITS, "Index out of bounds");
348 let mask = T::from(1) << idx;
349 if set {
350 self.inner |= mask;
351 } else {
352 self.inner &= !mask;
353 }
354 }
355
356 /// 获取指定索引的位的值。
357 ///
358 /// 返回 `true` 如果该位为 1,否则返回 `false`。
359 ///
360 /// # Panics
361 ///
362 /// 如果 `idx` 超出位图的范围(`idx >= T::BITS`),在调试模式下会触发 panic。
363 ///
364 /// # 示例
365 /// ```
366 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
367 /// let mut bitmap = Bitmap::<u8>::new();
368 /// bitmap.set(7, true);
369 /// assert_eq!(bitmap.get(7), true);
370 /// assert_eq!(bitmap.get(0), false);
371 /// ```
372 #[inline]
373 pub fn get(&self, idx: usize) -> bool {
374 debug_assert!(idx < T::BITS, "Index out of bounds");
375 let mask = T::from(1) << idx;
376 (self.inner & mask) != T::from(0)
377 }
378
379 /// 检查指定索引的位是否为 1。`get` 的别名。
380 ///
381 /// # 示例
382 /// ```
383 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
384 /// let mut bitmap = Bitmap::<u8>::new();
385 /// bitmap.set(1, true);
386 /// assert!(bitmap.is_one_on(1));
387 /// ```
388 #[inline]
389 pub fn is_one_on(&self, idx: usize) -> bool {
390 self.get(idx)
391 }
392
393 /// 检查指定索引的位是否为 0。
394 ///
395 /// # 示例
396 /// ```
397 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
398 /// let mut bitmap = Bitmap::<u8>::new();
399 /// bitmap.set(1, true);
400 /// assert!(bitmap.is_zero_on(0));
401 /// ```
402 #[inline]
403 pub fn is_zero_on(&self, idx: usize) -> bool {
404 !self.get(idx)
405 }
406
407 /// 将两个位图进行合并(并集),等同于 `|` 按位或操作。
408 ///
409 /// # 示例
410 /// ```
411 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
412 /// let mut b1 = Bitmap::<u8>::new();
413 /// b1.set(1, true); // 00000010
414 /// let mut b2 = Bitmap::<u8>::new();
415 /// b2.set(2, true); // 00000100
416 ///
417 /// let merged = b1.merge(b2); // 00000110
418 /// assert!(merged.get(1));
419 /// assert!(merged.get(2));
420 /// ```
421 #[inline]
422 pub fn merge(self, rhs: Bitmap<T>) -> Bitmap<T> {
423 self | rhs
424 }
425
426 /// 计算值为 1 的位的数量。
427 ///
428 /// # 示例
429 /// ```
430 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
431 /// let mut bitmap = Bitmap::<u8>::new();
432 /// bitmap.set(0, true);
433 /// bitmap.set(2, true);
434 /// bitmap.set(4, true);
435 /// assert_eq!(bitmap.count_ones(), 3);
436 /// ```
437 #[inline]
438 pub fn count_ones(&self) -> u32 {
439 self.inner.count_ones()
440 }
441
442 /// 计算值为 0 的位的数量。
443 ///
444 /// # 示例
445 /// ```
446 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
447 /// let mut bitmap = Bitmap::<u8>::new();
448 /// bitmap.set(0, true);
449 /// bitmap.set(2, true);
450 /// bitmap.set(4, true);
451 /// // u8 有 8 位,3 个是 1,所以 5 个是 0
452 /// assert_eq!(bitmap.count_zeros(), 5);
453 /// ```
454 #[inline]
455 pub fn count_zeros(&self) -> u32 {
456 T::BITS as u32 - self.inner.count_ones()
457 }
458
459 /// 检查位图中是否至少有一个位是 1。
460 ///
461 /// # 示例
462 /// ```
463 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
464 /// let mut b1 = Bitmap::<u8>::new();
465 /// b1.set(3, true);
466 /// assert!(b1.any());
467 ///
468 /// let b2 = Bitmap::<u8>::new();
469 /// assert!(!b2.any());
470 /// ```
471 #[inline]
472 pub fn any(&self) -> bool {
473 self.inner != T::from(0)
474 }
475
476 /// 检查位图中是否所有位都是 1。
477 ///
478 /// # 示例
479 /// ```
480 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
481 /// let b1 = Bitmap::<u8>::new_full();
482 /// assert!(b1.all());
483 ///
484 /// let mut b2 = Bitmap::<u8>::new_full();
485 /// b2.set(4, false);
486 /// assert!(!b2.all());
487 /// ```
488 #[inline]
489 pub fn all(&self) -> bool {
490 self.inner == !T::from(0)
491 }
492
493 /// 检查位图中是否所有位都是 0。
494 ///
495 /// # 示例
496 /// ```
497 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
498 /// let b1 = Bitmap::<u8>::new();
499 /// assert!(b1.none());
500 ///
501 /// let mut b2 = Bitmap::<u8>::new();
502 /// b2.set(0, true);
503 /// assert!(!b2.none());
504 /// ```
505 #[inline]
506 pub fn none(&self) -> bool {
507 self.inner == T::from(0)
508 }
509
510 /// 查找第一个值为 1 的位的索引。
511 ///
512 /// 如果所有位都为 0,则返回 `None`。
513 ///
514 /// # 示例
515 /// ```
516 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
517 /// let mut bitmap = Bitmap::<u16>::new();
518 /// bitmap.set(5, true);
519 /// bitmap.set(10, true);
520 /// assert_eq!(bitmap.first_one(), Some(5));
521 ///
522 /// let empty_bitmap = Bitmap::<u16>::new();
523 /// assert_eq!(empty_bitmap.first_one(), None);
524 /// ```
525 #[inline]
526 pub fn first_one(&self) -> Option<usize> {
527 if self.none() {
528 None
529 } else {
530 Some(self.inner.trailing_zeros() as usize)
531 }
532 }
533}
534
535impl<T: BitStorage> BitAnd for Bitmap<T> {
536 type Output = Self;
537 /// 按位与(&)。
538 ///
539 /// # 示例
540 /// ```
541 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
542 /// let mut b1 = Bitmap::<u8>::from(0b__0000_1101); // 位 0, 2, 3 的值为 1
543 /// let mut b2 = Bitmap::<u8>::from(0b__0000_1011); // 位 0, 1, 3 的值为 1
544 /// let result = b1 & b2;
545 /// let expected = Bitmap::<u8>::from(0b__0000_1001); // 位 0, 3 的值为 1
546 /// assert_eq!(result, expected);
547 /// ```
548 fn bitand(self, rhs: Self) -> Self::Output {
549 Self {
550 inner: self.inner & rhs.inner,
551 }
552 }
553}
554
555impl<T: BitStorage> BitAndAssign for Bitmap<T> {
556 /// 按位或后赋值(&=)。
557 ///
558 /// # 示例
559 /// ```
560 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
561 /// let mut b1 = Bitmap::<u8>::from(0b__0000_1101); // 位 0, 2, 3 的值为 1
562 /// let mut b2 = Bitmap::<u8>::from(0b__0000_1011); // 位 0, 1, 3 的值为 1
563 /// b1 &= b2;
564 /// let expected = Bitmap::<u8>::from(0b__0000_1001); // 位 0, 3 的值为 1
565 /// assert_eq!(b1, expected);
566 /// ```
567 fn bitand_assign(&mut self, rhs: Self) {
568 self.inner &= rhs.inner
569 }
570}
571
572impl<T: BitStorage> BitOr for Bitmap<T> {
573 type Output = Self;
574 /// 按位或(|)。
575 ///
576 /// # 示例
577 /// ```
578 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
579 /// let mut b1 = Bitmap::<u8>::from(0b__0000_1101); // 位 0, 2, 3 的值为 1
580 /// let mut b2 = Bitmap::<u8>::from(0b__0000_1011); // 位 0, 1, 3 的值为 1
581 /// let result = b1 | b2;
582 /// let expected = Bitmap::<u8>::from(0b__0000_1111); // 位 0, 1, 2, 3 的值为 1
583 /// assert_eq!(result, expected);
584 /// ```
585 fn bitor(self, rhs: Self) -> Self::Output {
586 Self {
587 inner: self.inner | rhs.inner,
588 }
589 }
590}
591
592impl<T: BitStorage> BitOrAssign for Bitmap<T> {
593 /// 按位或后赋值(|=)。
594 ///
595 /// # 示例
596 /// ```
597 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
598 /// let mut b1 = Bitmap::<u8>::from(0b__0000_1101); // 位 0, 2, 3 的值为 1
599 /// let mut b2 = Bitmap::<u8>::from(0b__0000_1011); // 位 0, 1, 3 的值为 1
600 /// b1 |= b2;
601 /// let expected = Bitmap::<u8>::from(0b__0000_1111); // 位 0, 1, 2, 3 的值为 1
602 /// assert_eq!(b1, expected);
603 /// ```
604 fn bitor_assign(&mut self, rhs: Self) {
605 self.inner |= rhs.inner
606 }
607}
608
609impl<T: BitStorage> BitXor for Bitmap<T> {
610 type Output = Self;
611 /// 按位异或(^)
612 ///
613 /// # 示例
614 /// ```
615 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
616 /// let mut b1 = Bitmap::<u8>::from(0b__0000_1101); // 位 0, 2, 3 的值为 1
617 /// let mut b2 = Bitmap::<u8>::from(0b__0000_1011); // 位 0, 1, 3 的值为 1
618 /// let result = b1 ^ b2;
619 /// let expected = Bitmap::<u8>::from(0b__0000_0110); // 位 1, 2 的值为 1
620 /// assert_eq!(result, expected);
621 /// ```
622 fn bitxor(self, rhs: Self) -> Self::Output {
623 Self {
624 inner: self.inner ^ rhs.inner,
625 }
626 }
627}
628
629impl<T: BitStorage> BitXorAssign for Bitmap<T> {
630 /// 按位或后赋值(^=)。
631 ///
632 /// # 示例
633 /// ```
634 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
635 /// let mut b1 = Bitmap::<u8>::from(0b__0000_1101); // 位 0, 2, 3 的值为 1
636 /// let mut b2 = Bitmap::<u8>::from(0b__0000_1011); // 位 0, 1, 3 的值为 1
637 /// b1 ^= b2;
638 /// let expected = Bitmap::<u8>::from(0b__0000_0110); // 位 1, 2 的值为 1
639 /// assert_eq!(b1, expected);
640 /// ```
641 fn bitxor_assign(&mut self, rhs: Self) {
642 self.inner ^= rhs.inner
643 }
644}
645
646impl<T: BitStorage> Not for Bitmap<T> {
647 type Output = Self;
648 /// 按位取反(!)
649 ///
650 /// # 示例
651 /// ```
652 /// # use crab_vault_utils::bitmap::{Bitmap, BitStorage};
653 /// let b = Bitmap::<u8>::from(0b__1111_0000);
654 /// let result = !b;
655 /// let expected = Bitmap::<u8>::from(0b__0000_1111);
656 /// assert_eq!(result, expected);
657 /// ```
658 fn not(self) -> Self::Output {
659 Self { inner: !self.inner }
660 }
661}