summaryrefslogtreecommitdiffstats
path: root/src/utils/gen_util.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/gen_util.rs')
-rw-r--r--src/utils/gen_util.rs92
1 files changed, 53 insertions, 39 deletions
diff --git a/src/utils/gen_util.rs b/src/utils/gen_util.rs
index 3a729f2e..ae35da8d 100644
--- a/src/utils/gen_util.rs
+++ b/src/utils/gen_util.rs
@@ -4,45 +4,7 @@ use tui::text::{Line, Span, Text};
use unicode_segmentation::UnicodeSegmentation;
use unicode_width::UnicodeWidthStr;
-pub const KILO_LIMIT: u64 = 1000;
-pub const MEGA_LIMIT: u64 = 1_000_000;
-pub const GIGA_LIMIT: u64 = 1_000_000_000;
-pub const TERA_LIMIT: u64 = 1_000_000_000_000;
-pub const KIBI_LIMIT: u64 = 1024;
-pub const MEBI_LIMIT: u64 = 1024 * 1024;
-pub const GIBI_LIMIT: u64 = 1024 * 1024 * 1024;
-pub const TEBI_LIMIT: u64 = 1024 * 1024 * 1024 * 1024;
-
-pub const KILO_LIMIT_F64: f64 = 1000.0;
-pub const MEGA_LIMIT_F64: f64 = 1_000_000.0;
-pub const GIGA_LIMIT_F64: f64 = 1_000_000_000.0;
-pub const TERA_LIMIT_F64: f64 = 1_000_000_000_000.0;
-pub const KIBI_LIMIT_F64: f64 = 1024.0;
-pub const MEBI_LIMIT_F64: f64 = 1024.0 * 1024.0;
-pub const GIBI_LIMIT_F64: f64 = 1024.0 * 1024.0 * 1024.0;
-pub const TEBI_LIMIT_F64: f64 = 1024.0 * 1024.0 * 1024.0 * 1024.0;
-
-pub const LOG_KILO_LIMIT: f64 = 3.0;
-pub const LOG_MEGA_LIMIT: f64 = 6.0;
-pub const LOG_GIGA_LIMIT: f64 = 9.0;
-pub const LOG_TERA_LIMIT: f64 = 12.0;
-pub const LOG_PETA_LIMIT: f64 = 15.0;
-
-pub const LOG_KIBI_LIMIT: f64 = 10.0;
-pub const LOG_MEBI_LIMIT: f64 = 20.0;
-pub const LOG_GIBI_LIMIT: f64 = 30.0;
-pub const LOG_TEBI_LIMIT: f64 = 40.0;
-pub const LOG_PEBI_LIMIT: f64 = 50.0;
-
-pub const LOG_KILO_LIMIT_U32: u32 = 3;
-pub const LOG_MEGA_LIMIT_U32: u32 = 6;
-pub const LOG_GIGA_LIMIT_U32: u32 = 9;
-pub const LOG_TERA_LIMIT_U32: u32 = 12;
-
-pub const LOG_KIBI_LIMIT_U32: u32 = 10;
-pub const LOG_MEBI_LIMIT_U32: u32 = 20;
-pub const LOG_GIBI_LIMIT_U32: u32 = 30;
-pub const LOG_TEBI_LIMIT_U32: u32 = 40;
+use super::data_prefixes::*;
/// Returns a tuple containing the value and the unit in bytes. In units of 1024.
/// This only supports up to a tebi. Note the "single" unit will have a space appended to match the others if
@@ -201,6 +163,29 @@ pub fn partial_ordering_desc<T: PartialOrd>(a: T, b: T) -> Ordering {
partial_ordering(a, b).reverse()
}
+/// Checks that the first string is equal to any of the other ones in a ASCII case-insensitive match.
+///
+/// The generated code is the same as writing:
+/// `to_ascii_lowercase(a) == to_ascii_lowercase(b) || to_ascii_lowercase(a) == to_ascii_lowercase(c)`,
+/// but without allocating and copying temporaries.
+///
+/// # Examples
+///
+/// ```ignore
+/// assert!(multi_eq_ignore_ascii_case!("test", "test"));
+/// assert!(multi_eq_ignore_ascii_case!("test", "a" | "b" | "test"));
+/// assert!(!multi_eq_ignore_ascii_case!("test", "a" | "b" | "c"));
+/// ```
+#[macro_export]
+macro_rules! multi_eq_ignore_ascii_case {
+ ( $lhs:expr, $last:literal ) => {
+ $lhs.eq_ignore_ascii_case($last)
+ };
+ ( $lhs:expr, $head:literal | $($tail:tt)* ) => {
+ $lhs.eq_ignore_ascii_case($head) || multi_eq_ignore_ascii_case!($lhs, $($tail)*)
+ };
+}
+
#[cfg(test)]
mod test {
use super::*;
@@ -382,4 +367,33 @@ mod test {
assert_eq!(truncate_str(scientist, 1_usize), "…");
assert_eq!(truncate_str(scientist, 0_usize), "");
}
+
+ #[test]
+ fn test_multi_eq_ignore_ascii_case() {
+ assert!(
+ multi_eq_ignore_ascii_case!("test", "test"),
+ "single comparison should succeed"
+ );
+ assert!(
+ multi_eq_ignore_ascii_case!("test", "a" | "test"),
+ "double comparison should succeed"
+ );
+ assert!(
+ multi_eq_ignore_ascii_case!("test", "a" | "b" | "test"),
+ "multi comparison should succeed"
+ );
+
+ assert!(
+ !multi_eq_ignore_ascii_case!("test", "a"),
+ "single non-matching should fail"
+ );
+ assert!(
+ !multi_eq_ignore_ascii_case!("test", "a" | "b"),
+ "double non-matching should fail"
+ );
+ assert!(
+ !multi_eq_ignore_ascii_case!("test", "a" | "b" | "c"),
+ "multi non-matching should fail"
+ );
+ }
}