diff --git a/src/lib.rs b/src/lib.rs index 63e6e3c..2f34658 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,11 +1,9 @@ use std::{ - sync::{ - atomic::{AtomicUsize, Ordering::Relaxed}, - Arc, RwLock, - }, + sync::{Arc, RwLock}, thread, }; +#[derive(Debug, Default, Clone, Copy, PartialEq, PartialOrd)] pub struct Point2d { pub x: f64, pub y: f64, @@ -13,8 +11,8 @@ pub struct Point2d { #[derive(Debug, Default, Clone, Copy)] pub struct PVal { - pub point: usize, - pub val: f64, + point_index: usize, + val: f64, } impl PartialEq for PVal { @@ -41,21 +39,25 @@ impl Ord for PVal { impl PVal { pub fn new(point: usize, val: f64) -> Self { - Self { point, val } + Self { + point_index: point, + val, + } } pub fn point_index(&self) -> usize { - self.point + self.point_index } - // pub fn val(&self) -> f64 { - // f64::from_bits(self.val) - // } + pub fn val(&self) -> f64 { + self.val + } } +#[derive(Debug, Default, Clone)] pub struct Spindex2d { - pub xpoints: Arc>, - pub ypoints: Arc>, + pub xpoints: Arc>>, + pub ypoints: Arc>>, pub xs: Arc>>, pub ys: Arc>>, } @@ -67,24 +69,18 @@ impl Spindex2d { let mut xs = Vec::with_capacity(points.len()); let mut ys = Vec::with_capacity(points.len()); for (i, point) in points.iter().enumerate() { - let x = PVal { - point: i, - val: point.x, - }; + let x = PVal::new(i, point.x); xs.push(x); - let y = PVal { - point: i, - val: point.y, - }; + let y = PVal::new(i, point.y); ys.push(y); - xpoints.push(AtomicUsize::new(i)); - ypoints.push(AtomicUsize::new(i)); + xpoints.push(i); + ypoints.push(i); } let index = Self { - xpoints: xpoints.into(), - ypoints: ypoints.into(), + xpoints: Arc::new(xpoints.into()), + ypoints: Arc::new(ypoints.into()), xs: Arc::new(RwLock::new(xs)), ys: Arc::new(RwLock::new(ys)), }; @@ -101,15 +97,15 @@ impl Spindex2d { { let mut xs = self.xs.write().unwrap(); let mut ys = self.ys.write().unwrap(); + let xpoints = self.xpoints.read().unwrap(); + let ypoints = self.ypoints.read().unwrap(); for (i, point) in points.iter().enumerate() { - let xi = self.xpoints[i].load(Relaxed); - let yi = self.ypoints[i].load(Relaxed); - let x = point.x; - let x = PVal { point: i, val: x }; + let xi = xpoints[i]; + let yi = ypoints[i]; + let x = PVal::new(i, point.x); xs[xi] = x; - let y = point.y; - let y = PVal { point: i, val: y }; + let y = PVal::new(i, point.y); ys[yi] = y; } } @@ -122,9 +118,10 @@ impl Spindex2d { let xhandle = thread::spawn(move || { let mut xs = xs.write().unwrap(); xs.sort_unstable(); + let mut points = points.write().unwrap(); for (i, x) in xs.iter().enumerate() { - let p = x.point; - points[p].store(i, Relaxed); + let p = x.point_index; + points[p] = i; } }); @@ -133,9 +130,10 @@ impl Spindex2d { let yhandle = thread::spawn(move || { let mut ys = ys.write().unwrap(); ys.sort_unstable(); + let mut points = points.write().unwrap(); for (i, y) in ys.iter().enumerate() { - let p = y.point; - points[p].store(i, Relaxed); + let p = y.point_index; + points[p] = i; } });