commit 97d0354aa9e54d27830483f8322414811ae628c4 Author: Yash Karandikar Date: Mon Feb 20 17:56:19 2023 -0600 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..26d7acb --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "interplut" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..47761fb --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "interplut" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..dfc2aa0 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,54 @@ +use std::fmt::Display; + +#[derive(Debug, Clone, Default)] +pub struct InterpLUT { + inner: Vec<(T, T)>, +} + +impl InterpLUT { + /// Creates a new, empty table. + pub fn new() -> InterpLUT { + Self::default() + } + + fn sort(&mut self) { + for i in 0..self.inner.len() { + for j in 0..i { + if self.inner[j].0 > self.inner[i].0 { + self.inner.swap(i, j); + } + } + } + } + + /// Inserts a new point into the table. Worst case is O(n^2) due to needing to sort the table + /// after inserting. + pub fn insert(&mut self, m: f64, n: f64) { + self.inner.push((m, n)); + self.sort(); + } +} + +impl Display for InterpLUT { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let num_digits_largest = self + .inner + .last() + .copied() + .unwrap_or_default() + .0 + .log10() + .ceil() as usize; + + for &(m, n) in &self.inner { + writeln!( + f, + "|{: ^width$}|{: ^width$}|", + m, + n, + width = num_digits_largest + 2 + )?; + } + Ok(()) + } +} diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..7879768 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,16 @@ +use interplut::InterpLUT; + +fn main() { + let mut lut: InterpLUT = InterpLUT::new(); + + lut.insert(31.0, 5.0); + lut.insert(5.0, 31.0); + lut.insert(5.0, 31.0); + lut.insert(5.0, 31.0); + lut.insert(4.0, 31.0); + lut.insert(3.0, 31.0); + lut.insert(2.0, 31.0); + lut.insert(1.0, 31.0); + lut.insert(18.0, 31.0); + println!("{}", lut); +}