summaryrefslogtreecommitdiffstats
path: root/svgbob/src/optimizer.rs
diff options
context:
space:
mode:
authorJovansonlee Cesar <ivanceras@gmail.com>2017-06-29 07:24:18 +0800
committerJovansonlee Cesar <ivanceras@gmail.com>2017-06-29 07:24:18 +0800
commit986e4296404eb6a2395ffeee12163f9c5910a9c6 (patch)
treeaf7ff7038bd0befbb2fee100cbbdd12db3ed5e5b /svgbob/src/optimizer.rs
parent38e281fb431a063a056919f5e1c58d0f9c337f74 (diff)
A huge optimization by utilizing indexes instead of using iterator
Diffstat (limited to 'svgbob/src/optimizer.rs')
-rw-r--r--svgbob/src/optimizer.rs38
1 files changed, 20 insertions, 18 deletions
diff --git a/svgbob/src/optimizer.rs b/svgbob/src/optimizer.rs
index 943f4a9..4335701 100644
--- a/svgbob/src/optimizer.rs
+++ b/svgbob/src/optimizer.rs
@@ -6,24 +6,18 @@ use super::Point;
use super::Settings;
pub struct Optimizer {
- elements: Vec<(Loc, Vec<Element>)>,
+ elements: Vec<Vec<Vec<Element>>>,
}
impl Optimizer {
- pub fn new(elements: Vec<(Loc, Vec<Element>)>) -> Optimizer {
+ pub fn new(elements: Vec<Vec<Vec<Element>>>) -> Optimizer {
Optimizer { elements: elements }
}
fn get(&self, loc: &Loc) -> Option<&Vec<Element>> {
- let found = self.elements
- .iter()
- .find(|x| {
- let &(ref l, _) = *x;
- loc == l
- });
- match found {
- Some(&(_, ref elm)) => Some(elm),
- None => None,
+ match self.elements.get(loc.y as usize){
+ Some(row) => row.get(loc.x as usize),
+ None => None
}
}
@@ -100,15 +94,23 @@ impl Optimizer {
// the start -> end -> start chains nicely
pub fn optimize(&self, settings: &Settings) -> Vec<Element> {
let mut optimized = vec![];
- for &(ref loc, ref elem) in &self.elements {
- if self.is_edible(&loc) {
- ;
- } else {
- for e in elem {
- let traced = self.trace_elements(e, loc);
- optimized.push(traced);
+ let mut y = 0;
+ for line in &self.elements {
+ let mut x = 0;
+ for cell in line{
+ let loc = &Loc::new(x,y);
+ for elm in cell{
+ if self.is_edible(loc){
+ ;
+ }
+ else{
+ let traced = self.trace_elements(elm, loc);
+ optimized.push(traced);
+ }
}
+ x += 1;
}
+ y += 1;
}
if settings.compact_path {
self.merge_paths(optimized)