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 {
|
2023-02-28 22:40:08 +00:00
|
|
|
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
|
|
|
}
|
2023-03-03 00:19:29 +00:00
|
|
|
#[async_trait]
|
2023-11-28 10:23:28 +00:00
|
|
|
pub trait SortingList {
|
|
|
|
async fn new(length: usize, delay: f32) -> Self;
|
2023-03-03 00:19:29 +00:00
|
|
|
|
|
|
|
fn len(&self) -> usize;
|
|
|
|
|
2023-11-28 10:23:28 +00:00
|
|
|
async fn swap(&mut self, index1: usize, index2: usize) -> bool;
|
2023-03-03 00:19:29 +00:00
|
|
|
|
|
|
|
async fn draw(&mut self);
|
2023-11-28 10:23:28 +00:00
|
|
|
|
2023-03-03 00:19:29 +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-03-03 00:19:29 +00:00
|
|
|
|
2023-11-28 10:23:28 +00:00
|
|
|
fn lessThan(&mut self, a: usize, b: usize) -> bool;
|
2023-03-03 00:19:29 +00:00
|
|
|
|
2023-11-28 10:23:28 +00:00
|
|
|
fn lessThanEqual(&mut self, a: usize, b: usize) -> bool;
|
2023-03-03 00:19:29 +00:00
|
|
|
|
|
|
|
fn isSorted(&mut self) -> bool;
|
|
|
|
|
2023-11-28 10:23:28 +00:00
|
|
|
async fn set(&mut self, i: usize, elem: Bar) -> bool;
|
2023-03-03 00:19:29 +00:00
|
|
|
|
|
|
|
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 {
|
2023-03-04 22:11:05 +00:00
|
|
|
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-12-06 15:40:58 +00:00
|
|
|
}
|
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 {
|
2022-11-07 00:21:18 +00:00
|
|
|
self.writes += 2;
|
|
|
|
self.reads += 2;
|
2022-11-06 21:44:59 +00:00
|
|
|
self.list.swap(index1, index2);
|
2023-03-04 22:27:01 +00:00
|
|
|
|
2023-03-04 03:00:49 +00:00
|
|
|
self.lastTouched.clear();
|
|
|
|
self.lastTouched.push(index1);
|
|
|
|
self.lastTouched.push(index2);
|
2022-12-06 15:40:58 +00:00
|
|
|
self.draw().await;
|
2023-03-04 03:00:49 +00:00
|
|
|
|
2023-02-26 22:25:41 +00:00
|
|
|
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
|
|
|
|
2023-03-03 00:19:29 +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 {
|
2022-11-07 00:21:18 +00:00
|
|
|
self.reads += 1;
|
2023-03-04 03:00:49 +00:00
|
|
|
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 {
|
2022-11-07 00:21:18 +00:00
|
|
|
self.comps += 1;
|
2023-11-28 10:23:28 +00:00
|
|
|
return self.get(a).position < self.get(b).position;
|
2022-11-07 00:21:18 +00:00
|
|
|
}
|
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 {
|
2023-03-02 23:49:41 +00:00
|
|
|
self.writes += 1;
|
|
|
|
self.reads += 1;
|
|
|
|
self.list[i] = elem;
|
|
|
|
self.draw().await;
|
2023-11-28 10:23:28 +00:00
|
|
|
|
2023-03-04 03:00:49 +00:00
|
|
|
self.lastTouched.clear();
|
|
|
|
self.lastTouched.push(i);
|
2023-03-02 23:49:41 +00:00
|
|
|
self.done
|
|
|
|
}
|
2023-11-28 10:23:28 +00:00
|
|
|
async fn show(&mut self) {
|
|
|
|
loop {
|
|
|
|
if !self.done {
|
2023-02-26 22:25:41 +00:00
|
|
|
self.draw().await
|
2023-11-28 10:23:28 +00:00
|
|
|
} else {
|
|
|
|
break;
|
2023-02-26 22:25:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-28 10:23:28 +00:00
|
|
|
fn getListClone(&self) -> Vec<Bar> {
|
2023-03-03 00:19:29 +00:00
|
|
|
self.list.clone()
|
|
|
|
}
|
2022-11-06 21:44:59 +00:00
|
|
|
}
|
|
|
|
|
2023-11-28 10:23:28 +00:00
|
|
|
pub struct NonGuiVec {
|
2023-03-03 00:19:29 +00:00
|
|
|
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 {
|
2023-03-03 00:19:29 +00:00
|
|
|
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))
|
2023-03-03 00:19:29 +00:00
|
|
|
}
|
|
|
|
NonGuiVec { list: list }
|
2023-11-28 10:23:28 +00:00
|
|
|
}
|
2023-03-03 00:19:29 +00:00
|
|
|
|
2023-11-28 10:23:28 +00:00
|
|
|
fn len(&self) -> usize {
|
2023-03-03 00:19:29 +00:00
|
|
|
self.list.len()
|
|
|
|
}
|
|
|
|
|
2023-11-28 10:23:28 +00:00
|
|
|
async fn swap(&mut self, index1: usize, index2: usize) -> bool {
|
2023-03-03 00:19:29 +00:00
|
|
|
self.list.swap(index1, index2);
|
|
|
|
false
|
|
|
|
}
|
|
|
|
|
2023-11-28 10:23:28 +00:00
|
|
|
async fn draw(&mut self) {
|
2023-03-03 00:19:29 +00:00
|
|
|
self.swap(0, 0).await;
|
|
|
|
}
|
2023-11-28 10:23:28 +00:00
|
|
|
|
|
|
|
fn randomize(&mut self) {}
|
2023-03-03 00:19:29 +00:00
|
|
|
|
|
|
|
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 {
|
2023-03-03 00:19:29 +00:00
|
|
|
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-03-03 00:19:29 +00:00
|
|
|
}
|
2023-11-28 10:23:28 +00:00
|
|
|
fn lessThanEqual(&mut self, a: usize, b: usize) -> bool {
|
|
|
|
return self.get(a).position <= b;
|
2023-03-03 00:19:29 +00:00
|
|
|
}
|
2023-11-28 10:23:28 +00:00
|
|
|
fn isSorted(&mut self) -> bool {
|
2023-03-03 00:19:29 +00:00
|
|
|
let mut prev = 0;
|
|
|
|
for bar in self.list.iter() {
|
2023-11-28 10:23:28 +00:00
|
|
|
if bar.position < prev {
|
2023-03-03 00:19:29 +00:00
|
|
|
return false;
|
2023-11-28 10:23:28 +00:00
|
|
|
} else {
|
2023-03-03 00:19:29 +00:00
|
|
|
prev = bar.position;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
true
|
|
|
|
}
|
2023-11-28 10:23:28 +00:00
|
|
|
async fn set(&mut self, i: usize, elem: Bar) -> bool {
|
2023-03-03 00:19:29 +00:00
|
|
|
self.list[i] = elem;
|
|
|
|
self.draw().await;
|
2023-03-04 03:00:49 +00:00
|
|
|
|
2023-03-03 00:19:29 +00:00
|
|
|
false
|
|
|
|
}
|
2023-11-28 10:23:28 +00:00
|
|
|
async fn show(&mut self) {}
|
|
|
|
fn getListClone(&self) -> Vec<Bar> {
|
2023-03-03 00:19:29 +00:00
|
|
|
self.list.clone()
|
|
|
|
}
|
|
|
|
}
|