diff gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/LevelOrderIndices.java @ 450:20a480753ff9

Render labels in vertical cross section charts. gnv-artifacts/trunk@498 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 04 Jan 2010 02:49:42 +0000
parents
children c4156275c1e1
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gnv-artifacts/src/main/java/de/intevation/gnv/jfreechart/LevelOrderIndices.java	Mon Jan 04 02:49:42 2010 +0000
@@ -0,0 +1,58 @@
+package de.intevation.gnv.jfreechart;
+
+import java.util.LinkedList;
+
+/**
+ * @author Sascha L. Teichmann (sascha.teichmann@intevation.de)
+ */
+public class LevelOrderIndices
+{
+    public interface Visitor {
+        Object visit(int index);
+    }
+
+    protected int from;
+    protected int to;
+
+    public LevelOrderIndices() {
+    }
+
+    public LevelOrderIndices(int to) {
+        this(0, to);
+    }
+
+    public LevelOrderIndices(int from, int to) {
+        this.from = Math.min(from, to);
+        this.to   = Math.max(from, to);
+    }
+
+    public Object visit(Visitor visitor) {
+        LinkedList<int[]> queue = new LinkedList<int[]>();
+
+        queue.add(new int [] { from, to });
+
+        while (!queue.isEmpty()) {
+            int [] pair = queue.remove();
+
+            int mid = (pair[0] + pair[1]) >> 1;
+
+            Object result = visitor.visit(mid);
+
+            if (result != null) {
+                return result;
+            }
+
+            if (mid-1 >= pair[0]) {
+                queue.add(new int [] { pair[0], mid-1 });
+            }
+
+            if (mid+1 <= pair[1]) {
+                pair[0] = mid+1;
+                queue.add(pair);
+            }
+        }
+
+        return null;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org