cp_library_rs/utils/
coordinate_compression.rs1#[derive(Debug)]
5pub struct Compression<'a, T> {
6 pub size: usize,
7 pub sorted_array: Vec<&'a T>,
8}
9
10impl<'a, T: Ord> Compression<'a, T> {
11 pub fn new(array: &'a [T]) -> Self {
13 array.iter().collect()
14 }
15
16 pub fn idx(&self, val: &T) -> Option<usize> {
18 let idx = self.sorted_array.binary_search(&val);
19 idx.ok()
20 }
21
22 pub fn val(&self, idx: usize) -> Option<&T> {
24 if let Some(&val) = self.sorted_array.get(idx) {
25 Some(val)
26 } else {
27 None
28 }
29 }
30}
31
32impl<'a, T: Ord> FromIterator<&'a T> for Compression<'a, T> {
33 fn from_iter<I: IntoIterator<Item = &'a T>>(iter: I) -> Self {
34 let mut comp: Vec<&'a T> = iter.into_iter().collect();
35 comp.sort();
36 comp.dedup();
37 Self {
38 size: comp.len(),
39 sorted_array: comp,
40 }
41 }
42}