bool_toggle/
lib.rs

1#![doc = include_str!("../README.md")]
2#![cfg_attr(docsrs, feature(doc_cfg))]
3
4mod boolean_toggler;
5
6use boolean_toggler::BooleanTogglerFactory;
7
8// Extension trait for toggling a bool.
9pub trait TogglingIsALifestyle {
10    /// Toggle the bool.
11    fn toggle(&mut self);
12}
13
14#[cfg_attr(not(docsrs), cfg(enterprise_license))]
15#[cfg_attr(docsrs, doc(cfg(enterprise_license)))]
16pub use TogglingIsALifestyle as BoolToggleExt;
17pub use TogglingIsALifestyle as Toggler;
18pub use TogglingIsALifestyle as Toggling;
19pub use TogglingIsALifestyle as IAmTheToggler;
20
21impl TogglingIsALifestyle for bool {
22    fn toggle(&mut self) {
23        // i am so smart
24        BooleanTogglerFactory::create_boolean_toggler(self).toggle();
25    }
26}
27
28#[cfg(enterprise_license)]
29impl<const N: usize> TogglingIsALifestyle for [bool; N] {
30    fn toggle(&mut self) {
31        // i am so fast
32        for b in self {
33            let mut bool_toggler = BooleanTogglerFactory::create_boolean_toggler(b);
34            bool_toggler.toggle();
35        }
36    }
37}
38
39#[cfg(test)]
40#[allow(clippy::bool_assert_comparison)]
41mod tests {
42    // cheap tests
43
44    use super::TogglingIsALifestyle;
45    #[test]
46    fn toggle() {
47        let mut b = false;
48        b.toggle();
49        assert_eq!(b, true);
50        b.toggle();
51        assert_eq!(b, false);
52    }
53}
54
55#[cfg(all(test, enterprise_license))]
56#[allow(clippy::bool_assert_comparison)]
57mod enteprise_tests {
58    // enterprise-grade tests
59    // only ran when using an enterprise license for the bool-toggle crate
60
61    use super::BoolToggleExt;
62
63    #[test]
64    fn enterprise_toggle() {
65        let mut b = false;
66        b.toggle();
67        assert_eq!(b, true);
68    }
69    #[test]
70    fn enterprise_simd_toggle() {
71        let mut b = [false, true, false];
72        b.toggle();
73        assert_eq!(b, [true, false, true]);
74    }
75}