fn numerical_string_compare()

in aws-lc-rs/util/process-criterion-csv.rs [196:247]


fn numerical_string_compare(a: &str, b: &str) -> Ordering {
    let mut number_compare = false;
    let mut a_num = 0u32;
    let mut b_num = 0u32;

    for pair in a.chars().into_iter().zip_longest(b.chars().into_iter()) {
        match pair {
            Both(ac, bc) => {
                if ac.is_digit(10) {
                    if bc.is_digit(10) {
                        if ac.cmp(&bc).is_eq() {
                            continue;
                        }
                        a_num *= 10;
                        a_num += ac.to_digit(10).unwrap();
                        b_num *= 10;
                        b_num += bc.to_digit(10).unwrap();
                        number_compare = true;
                    } else if number_compare {
                        return Ordering::Greater;
                    } else {
                        return ac.cmp(&bc);
                    }
                } else if bc.is_digit(10) {
                    return if number_compare {
                        Ordering::Less
                    } else {
                        ac.cmp(&bc)
                    };
                } else if number_compare {
                    return a_num.cmp(&b_num);
                } else {
                    let result = ac.cmp(&bc);
                    if !result.is_eq() {
                        return result;
                    }
                }
            }
            Left(_ac) => {
                return Ordering::Greater;
            }
            Right(_bc) => {
                return Ordering::Less;
            }
        }
    }
    return if number_compare {
        a_num.cmp(&b_num)
    } else {
        Ordering::Equal
    };
}