1 use stud_rust_base::{io::*, cli::CliErr};
2 use std::{env, fmt::Display, error::Error};
4 fn main() -> Result<(), Box<dyn Error>> {
5 match &env::args().skip(1).collect::<Vec<String>>()[..] {
6 [data_type, input1, input2] => {
7 match data_type.as_ref() {
8 "i8" => { compare_values(&Vec::<i8>::load_from(input1)?, &Vec::<i8>::load_from(input2)?); Ok(()) },
9 "u8" => { compare_values(&Vec::<u8>::load_from(input1)?, &Vec::<u8>::load_from(input2)?); Ok(()) },
10 "i16" => { compare_values(&Vec::<i16>::load_from(input1)?, &Vec::<i16>::load_from(input2)?); Ok(()) },
11 "u16" => { compare_values(&Vec::<u16>::load_from(input1)?, &Vec::<u16>::load_from(input2)?); Ok(()) },
12 "i32" => { compare_values(&Vec::<i32>::load_from(input1)?, &Vec::<i32>::load_from(input2)?); Ok(()) },
13 "u32" => { compare_values(&Vec::<u32>::load_from(input1)?, &Vec::<u32>::load_from(input2)?); Ok(()) },
14 "i64" => { compare_values(&Vec::<i64>::load_from(input1)?, &Vec::<i64>::load_from(input2)?); Ok(()) },
15 "u64" => { compare_values(&Vec::<u64>::load_from(input1)?, &Vec::<u64>::load_from(input2)?); Ok(()) },
16 "f32" => { compare_values(&Vec::<f32>::load_from(input1)?, &Vec::<f32>::load_from(input2)?); Ok(()) },
17 "f64" => { compare_values(&Vec::<f64>::load_from(input1)?, &Vec::<f64>::load_from(input2)?); Ok(()) },
18 "int8" => { compare_values(&Vec::<i8>::load_from(input1)?, &Vec::<i8>::load_from(input2)?); Ok(()) },
19 "uint8" => { compare_values(&Vec::<u8>::load_from(input1)?, &Vec::<u8>::load_from(input2)?); Ok(()) },
20 "int16" => { compare_values(&Vec::<i16>::load_from(input1)?, &Vec::<i16>::load_from(input2)?); Ok(()) },
21 "uint16" => { compare_values(&Vec::<u16>::load_from(input1)?, &Vec::<u16>::load_from(input2)?); Ok(()) },
22 "int32" => { compare_values(&Vec::<i32>::load_from(input1)?, &Vec::<i32>::load_from(input2)?); Ok(()) },
23 "uint32" => { compare_values(&Vec::<u32>::load_from(input1)?, &Vec::<u32>::load_from(input2)?); Ok(()) },
24 "int64" => { compare_values(&Vec::<i64>::load_from(input1)?, &Vec::<i64>::load_from(input2)?); Ok(()) },
25 "uint64" => { compare_values(&Vec::<u64>::load_from(input1)?, &Vec::<u64>::load_from(input2)?); Ok(()) },
26 "float32" => { compare_values(&Vec::<f32>::load_from(input1)?, &Vec::<f32>::load_from(input2)?); Ok(()) },
27 "float64" => { compare_values(&Vec::<f64>::load_from(input1)?, &Vec::<f64>::load_from(input2)?); Ok(()) },
30 Err(Box::new(CliErr("Invalid data type")))
36 Err(Box::new(CliErr("Invalid arguments")))
42 eprintln!("Usage: decode_vector data_type vector1_file vector2_file
44 Compares two vectors of elements in binary format. data_type can be one of
59 fn compare_values<T>(values1: &[T], values2: &[T]) where
63 if values1.len() != values2.len() {
65 eprintln!("Can only compare vectors of equal size. The first vector has {} elements. The second vector has {} elements.", values1.len(), values2.len());
69 let mut v1_smaller_count = 0;
70 let mut v2_smaller_count = 0;
71 let mut first_diff = None;
73 for (i, (v1, v2)) in values1.iter().zip(values2.iter()).enumerate() {
74 if v1 < v2 { v1_smaller_count += 1; }
75 if v2 < v1 { v2_smaller_count += 1; }
77 if first_diff.is_none() && v1 != v2 {
84 eprintln!("The vectors differ.");
85 eprintln!("{} elements are smaller in the first vector.", v1_smaller_count);
86 eprintln!("{} elements are smaller in the second vector.", v2_smaller_count);
87 eprintln!("{} elements are the same.", values1.len() - v1_smaller_count - v2_smaller_count);
88 println!("{}", values1.len() - v1_smaller_count - v2_smaller_count);
89 eprintln!("{} elements are different.", v1_smaller_count + v2_smaller_count);
90 eprintln!("The vectors have {} elements.", values1.len());
91 eprintln!("The first element that differs is at index {}.", index);
94 println!("{}", values1.len());
95 eprintln!("The vectors are the same and have {} elements.", values1.len());