//package fr.unistra.pelican.util;
//
//import java.awt.Point;
//import java.util.LinkedList;
//
///**
// * Hierarchical Queue used in several algorithms
// * @author lefevre
// *
// */
//public class HierarchicalQueue {
// // private LinkedList[] queue;
// private LinkedList[] queue;
//
// private int current;
// private int number;
// private int size;
// private boolean[] used;
//
// public int getCurrent() {
// return current;
// }
//
// public int getNumber() {
// return number;
// }
//
// public int size() {
// return size;
// }
//
//
// public HierarchicalQueue(int size) {
// queue = new LinkedList[size];
// for (int i = 0; i < size; i++)
// queue[i] = new LinkedList();
// this.size=size;
// current = 0;
// number = 0;
// used=new boolean[size];
// }
//
// public void add(Point p, int val) {
// if (val >= current)
// queue[val].add(p);
// else
// queue[current].add(p);
// number++;
// if(!used[val])
// used[val]=true;
// }
//
// public int used() {
// int realSize=0;
// for (int i=0;i<size;i++)
// if(used[i])
// realSize++;
// return realSize;
// }
//
// public Point get() {
// number--;
// if (queue[current].size() >= 2)
// return (Point) queue[current].removeFirst();
// else if (queue[current].size() == 1) {
// Point p = (Point) queue[current].removeFirst();
//
// while (current < size - 1 && number != 0
// && queue[current].size() == 0)
// current++;
// // System.out.println(current+" / "+number);
//
// return p;
//
// } else
// return null;
// }
//
// public void clear() {
// for (int i = 0; i < size; i++)
// queue[i].clear();
// current = 0;
// number = 0;
// }
//
// public void reset() {
// if(!isEmpty())
// clear();
// current = 0;
// number = 0;
// }
//
// public boolean isEmpty() {
// // int sum = 0;
// // for (int i = current; i < queue.length; i++)
// // sum += queue[i].size();
// // return (sum == 0);
// return (number == 0);
// }
//}
package fr.unistra.pelican.util;
import java.awt.Point;
import java.util.LinkedList;
/**
* Hierarchical Queue used in several algorithms
*
* @author lefevre
*
*/
public class HierarchicalQueue {
// private LinkedList[] queue;
private LinkedList[] queue;
private int current;
private int number;
private int size;
// private boolean[] used;
public int getCurrent() {
return current;
}
public int getNumber() {
return number;
}
public int size() {
return size;
}
public HierarchicalQueue(int size) {
queue = new LinkedList[size];
// for (int i = 0; i < size; i++)
// queue[i] = new LinkedList();
this.size = size;
current = 0;
number = 0;
// used = new boolean[size];
}
public void add(Point p, int val) {
if (val >= current) {
if (queue[val] == null)
queue[val] = new LinkedList();
queue[val].add(p);
} else {
if (queue[current] == null)
queue[current] = new LinkedList();
queue[current].add(p);
}
number++;
// if (!used[val])
// used[val] = true;
}
// public int used() {
// int realSize = 0;
// for (int i = 0; i < size; i++)
// if (used[i])
// realSize++;
// return realSize;
// }
public Point get() {
number--;
if (queue[current] != null && queue[current].size() >= 2)
return (Point) queue[current].removeFirst();
else if (queue[current] != null && queue[current].size() == 1) {
Point p = (Point) queue[current].removeFirst();
while (current < size - 1 && number != 0
&& (queue[current] == null || queue[current].size() == 0))
current++;
// System.out.println(current+" / "+number);
return p;
} else
return null;
}
public void clear() {
for (int i = 0; i < size; i++) {
if (queue[i] != null) {
queue[i].clear();
queue[i]=null;
}
// used[i] = false;
}
current = 0;
number = 0;
}
public void reset() {
if (!isEmpty())
clear();
current = 0;
number = 0;
}
public boolean isEmpty() {
// int sum = 0;
// for (int i = current; i < queue.length; i++)
// sum += queue[i].size();
// return (sum == 0);
return (number == 0);
}
}