geo_buffer/priority_queue/
mod.rs1#![allow(dead_code)]
2pub(crate) struct PriorityQueue<T: std::cmp::PartialOrd>{
3 size: usize,
4 content: Vec<T>,
5}
6
7impl<T: std::cmp::PartialOrd> PriorityQueue<T>{
8 pub fn new() -> Self{
9 Self { size: 0, content: Vec::new(), }
10 }
11
12 pub fn initialize(&mut self){
13 self.size = 0;
14 self.content = Vec::new();
15 }
16
17 pub fn is_empty(&self) -> bool{
18 self.size == 0
19 }
20
21 pub fn insert(&mut self, item: T){
22 self.content.push(item);
23 let mut cur = self.size;
24 let mut par;
25 while cur != 0{
26 par = (cur-1)/2;
27 if self.content[cur] < self.content[par] {
28 self.content.swap(cur, par);
29 cur = par;
30 }
31 else {break;}
32 }
33 self.size += 1;
34 }
35
36 pub fn peek(&self) -> Option<&T>{
37 if self.is_empty() == true {
38 return None;
39 }
40 Some(&self.content[0])
41 }
42
43 pub fn pop(&mut self) -> Option<T>{
44 if self.is_empty() == true {return None;}
45 let ret = self.content.swap_remove(0);
46 let mut cur = 0;
47 let mut nc;
48 self.size -= 1;
49 while cur < self.size{
50 let lc = cur*2 + 1;
51 let rc = cur*2 + 2;
52 if lc >= self.size {break;}
53 else if rc >= self.size {nc = lc;}
54 else {nc = if self.content[lc] < self.content[rc] {lc} else {rc};}
55 if self.content[nc] < self.content[cur] {
56 self.content.swap(cur, nc);
57 cur = nc;
58 }
59 else {break;}
60 }
61 Some(ret)
62 }
63}