1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
use std::iter::FromIterator; use crate::error::OrDistError; use crate::ordmap::OrdMap; use crate::traits::OrDistElement; pub fn check_identical<K: OrDistElement>( om1: &OrdMap<K>, om2: &OrdMap<K>, ) -> Result<(), OrDistError<K>> { match om1.identical(&om2) { Ok(_) => Ok(()), Err(e) => Err(e), } } pub fn ordmaps_identical<'a, K: OrDistElement>( v1: &'a [K], v2: &'a [K], ) -> Result<(OrdMap<&'a K>, OrdMap<&'a K>), OrDistError<K>> { let om1 = OrdMap::from_iter(v1); let om2 = OrdMap::from_iter(v2); check_identical(&om1, &om2)?; Ok((om1, om2)) } pub fn ordmaps_identical_owned<K: OrDistElement>( v1: &[K], v2: &[K], ) -> Result<(OrdMap<K>, OrdMap<K>), OrDistError<K>> { let om1 = OrdMap::from_iter(Vec::from(v1)); let om2 = OrdMap::from_iter(Vec::from(v2)); check_identical(&om1, &om2)?; Ok((om1, om2)) } pub fn sub_abs(a: usize, b: usize) -> usize { if a > b { a - b } else { b - a } } pub fn swap_vec<T: OrDistElement>(v: &mut [T], i1: usize, i2: usize) { let tmp = v[i1].clone(); v[i1] = v[i2].clone(); v[i2] = tmp; } pub fn swap_ordmap<K: OrDistElement>(om: &mut OrdMap<K>, k1: &K, k2: &K) { let tmp = om.get(k1); *(om.data.get_mut(k1).unwrap()) = om.get(k2); *(om.data.get_mut(k2).unwrap()) = tmp; }