Mercurial > dive4elements > gnv-client
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 :