BeepSortRust/src/GuiHookVec.rs

216 lines
5.1 KiB
Rust
Raw Normal View History

2022-11-06 21:44:59 +00:00
use crate::BarPlugin::Bar;
2023-11-28 10:23:28 +00:00
use async_trait::async_trait;
2022-11-06 21:44:59 +00:00
#[derive(Clone, Debug)]
2023-11-28 10:23:28 +00:00
pub struct GuiVec {
pub list: Vec<Bar>,
2023-11-28 10:23:28 +00:00
initialSize: usize,
pub lastTime: f64,
pub reads: i32,
pub writes: i32,
pub comps: i32,
isPaused: bool,
delay: f32,
pub done: bool,
renderSkip: i32,
skipped: i32,
lastTouched: Vec<usize>,
lastPlayed: f64,
2022-11-06 21:44:59 +00:00
}
#[async_trait]
2023-11-28 10:23:28 +00:00
pub trait SortingList {
async fn new(length: usize, delay: f32) -> Self;
fn len(&self) -> usize;
2023-11-28 10:23:28 +00:00
async fn swap(&mut self, index1: usize, index2: usize) -> bool;
async fn draw(&mut self);
2023-11-28 10:23:28 +00:00
fn randomize(&mut self);
fn elements(&mut self) -> std::slice::Iter<'_, Bar>;
2023-11-28 10:23:28 +00:00
fn get(&mut self, i: usize) -> &Bar;
2023-11-28 10:23:28 +00:00
fn lessThan(&mut self, a: usize, b: usize) -> bool;
2023-11-28 10:23:28 +00:00
fn lessThanEqual(&mut self, a: usize, b: usize) -> bool;
fn isSorted(&mut self) -> bool;
2023-11-28 10:23:28 +00:00
async fn set(&mut self, i: usize, elem: Bar) -> bool;
async fn show(&mut self);
fn getListClone(&self) -> Vec<Bar>;
}
#[async_trait]
2023-11-28 10:23:28 +00:00
impl SortingList for GuiVec {
async fn new(length: usize, delay: f32) -> Self {
let colorStep = 360. / length as f32;
let mut list: Vec<Bar> = vec![];
let freqStep = 50. + ((2000. - 50.) / length as f32);
for i in 1..length + 1 {
let frequency = i as f32 * freqStep;
2023-11-28 10:23:28 +00:00
list.push(Bar::new(i, (colorStep * i as f32) / 360.));
2022-11-06 21:44:59 +00:00
}
2023-03-04 23:21:12 +00:00
//Generate sounds
2023-11-28 10:23:28 +00:00
GuiVec {
list,
initialSize: length as usize,
lastTime: 0.0,
reads: 0,
writes: 0,
comps: 0,
isPaused: false,
delay,
done: false,
renderSkip: 1,
skipped: 0,
lastTouched: Vec::with_capacity(2),
lastPlayed: 0.,
}
2022-11-06 21:44:59 +00:00
}
2023-11-28 10:23:28 +00:00
async fn draw(&mut self) {}
2022-11-06 21:44:59 +00:00
2023-11-28 10:23:28 +00:00
fn len(&self) -> usize {
2022-11-06 21:44:59 +00:00
self.list.len()
}
2023-11-28 10:23:28 +00:00
async fn swap(&mut self, index1: usize, index2: usize) -> bool {
self.writes += 2;
self.reads += 2;
2022-11-06 21:44:59 +00:00
self.list.swap(index1, index2);
self.lastTouched.clear();
self.lastTouched.push(index1);
self.lastTouched.push(index2);
self.draw().await;
self.done
2022-11-06 21:44:59 +00:00
}
2023-11-28 10:23:28 +00:00
fn randomize(&mut self) {}
2022-11-06 21:44:59 +00:00
fn elements(&mut self) -> std::slice::Iter<'_, Bar> {
2022-11-06 21:44:59 +00:00
self.list.iter()
}
2023-11-28 10:23:28 +00:00
fn get(&mut self, i: usize) -> &Bar {
self.reads += 1;
self.lastTouched.clear();
self.lastTouched.push(i);
2022-11-06 21:44:59 +00:00
self.list.get(i).unwrap()
}
2023-11-28 10:23:28 +00:00
fn lessThan(&mut self, a: usize, b: usize) -> bool {
self.comps += 1;
2023-11-28 10:23:28 +00:00
return self.get(a).position < self.get(b).position;
}
2023-11-28 10:23:28 +00:00
fn lessThanEqual(&mut self, a: usize, b: usize) -> bool {
2023-02-28 23:01:34 +00:00
self.comps += 1;
2023-11-28 10:23:28 +00:00
return self.get(a).position <= b;
2023-02-28 23:01:34 +00:00
}
2023-11-28 10:23:28 +00:00
fn isSorted(&mut self) -> bool {
2022-11-07 00:44:35 +00:00
self.reads += self.len() as i32;
let mut prev = 0;
for bar in self.list.iter() {
2023-11-28 10:23:28 +00:00
if bar.position < prev {
2022-11-07 00:44:35 +00:00
return false;
2023-11-28 10:23:28 +00:00
} else {
2022-11-07 00:44:35 +00:00
prev = bar.position;
}
}
true
}
2023-11-28 10:23:28 +00:00
async fn set(&mut self, i: usize, elem: Bar) -> bool {
self.writes += 1;
self.reads += 1;
self.list[i] = elem;
self.draw().await;
2023-11-28 10:23:28 +00:00
self.lastTouched.clear();
self.lastTouched.push(i);
self.done
}
2023-11-28 10:23:28 +00:00
async fn show(&mut self) {
loop {
if !self.done {
self.draw().await
2023-11-28 10:23:28 +00:00
} else {
break;
}
}
}
2023-11-28 10:23:28 +00:00
fn getListClone(&self) -> Vec<Bar> {
self.list.clone()
}
2022-11-06 21:44:59 +00:00
}
2023-11-28 10:23:28 +00:00
pub struct NonGuiVec {
pub list: Vec<Bar>,
}
#[async_trait]
2023-11-28 10:23:28 +00:00
impl SortingList for NonGuiVec {
async fn new(length: usize, delay: f32) -> Self {
let mut list = Vec::new();
2023-11-28 10:23:28 +00:00
for i in 0..(length as usize) {
2023-03-04 23:21:12 +00:00
list.push(Bar::new(i, i as f32))
}
NonGuiVec { list: list }
2023-11-28 10:23:28 +00:00
}
2023-11-28 10:23:28 +00:00
fn len(&self) -> usize {
self.list.len()
}
2023-11-28 10:23:28 +00:00
async fn swap(&mut self, index1: usize, index2: usize) -> bool {
self.list.swap(index1, index2);
false
}
2023-11-28 10:23:28 +00:00
async fn draw(&mut self) {
self.swap(0, 0).await;
}
2023-11-28 10:23:28 +00:00
fn randomize(&mut self) {}
fn elements(&mut self) -> std::slice::Iter<'_, Bar> {
self.list.iter()
}
2023-11-28 10:23:28 +00:00
fn get(&mut self, i: usize) -> &Bar {
self.list.get(i).unwrap()
}
2023-11-28 10:23:28 +00:00
fn lessThan(&mut self, a: usize, b: usize) -> bool {
return self.get(a).position < self.get(b).position;
}
2023-11-28 10:23:28 +00:00
fn lessThanEqual(&mut self, a: usize, b: usize) -> bool {
return self.get(a).position <= b;
}
2023-11-28 10:23:28 +00:00
fn isSorted(&mut self) -> bool {
let mut prev = 0;
for bar in self.list.iter() {
2023-11-28 10:23:28 +00:00
if bar.position < prev {
return false;
2023-11-28 10:23:28 +00:00
} else {
prev = bar.position;
}
}
true
}
2023-11-28 10:23:28 +00:00
async fn set(&mut self, i: usize, elem: Bar) -> bool {
self.list[i] = elem;
self.draw().await;
false
}
2023-11-28 10:23:28 +00:00
async fn show(&mut self) {}
fn getListClone(&self) -> Vec<Bar> {
self.list.clone()
}
}