use std::fmt;
use crate::InternalMap;
type Distances = [Vec<(&'static InternalMap, u8)>; 129];
type NodeEntry = (u32, &'static InternalMap, u8);
#[derive(Clone)]
pub struct NodeQueue {
distances: Distances,
lowest: usize,
}
impl NodeQueue {
pub fn new() -> Self {
Default::default()
}
pub(crate) fn clear(&mut self) {
for v in self.distances.iter_mut() {
v.clear();
}
self.lowest = 0;
}
#[inline]
pub(crate) fn pop(&mut self) -> Option<NodeEntry> {
loop {
if let Some((node, level)) = self.distances[self.lowest].pop() {
return Some((self.lowest as u32, node, level));
} else if self.lowest == 128 {
return None;
} else {
self.lowest += 1;
}
}
}
#[inline]
pub(crate) fn add_one(&mut self, (distance, node, level): NodeEntry) {
self.distances[distance as usize].push((node, level));
}
pub(crate) fn distance(&mut self) -> Option<u32> {
self.distances[self.lowest..]
.iter()
.position(|v| !v.is_empty())
.map(|n| (n + self.lowest) as u32)
}
}
impl fmt::Debug for NodeQueue {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
self.distances[..].fmt(formatter)
}
}
impl Default for NodeQueue {
fn default() -> Self {
Self {
distances: [
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
vec![],
],
lowest: 0,
}
}
}