package jcircus.newfrontendmethod;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Vector;
public class FrontEndMapping {
private HashMap <String, Vector <Integer>> map;
//FrontEndCounter fec;
public FrontEndMapping () {
map = new LinkedHashMap <String, Vector <Integer>> ();
//fec = new FrontEndCounter ();
}
public FrontEndMapping (FrontEndMapping fem) {
map = new LinkedHashMap <String, Vector <Integer>> ();
map.putAll(fem.getMap());
//fec = new FrontEndCounter ();
}
public HashMap <String, Vector <Integer>> getMap () {
return this.map;
}
public void put (String channel, Vector <Integer> vec) {
this.map.put (channel, vec);
}
public void put (String channel, FrontEndCounter fec) {
Integer x = getMax (this.get(channel));
Vector <Integer> vec = new Vector <Integer> ();
vec.addElement(fec.get(channel));
this.put(channel, vec);
}
public Vector <Integer> get (String channel) {
if (!this.map.containsKey (channel)) {
return new Vector <Integer> ();
}
return this.map.get(channel);
}
private static Object [] withoutDuplicates (Object [] keys1, Object [] keys2) {
Vector <Object> keysall = new Vector <Object> (); //new Object [keys1.length + keys2.length];
for (int i = 0; i < keys1.length; i++) {
keysall.addElement(keys1 [i]);
}
for (int i = 0; i < keys2.length; i++) {
if (!keysall.contains (keys2 [i]))
keysall.addElement(keys2 [i]);
}
return keysall.toArray();
}
private Integer getMax (Vector <Integer> vec1) {
int aux = -1;
if (vec1.size() == 0)
return 0;
Object [] o = vec1.toArray();
for (int i = 0; i < vec1.size(); i++) {
if (aux < (Integer) o [i]) {
aux = (Integer) o [i];
}
}
return aux;
}
private static Integer getMin (Vector <Integer> vec1) {
int aux = 1000000; //FLAG INICIAL... ADMITIMOS QUE NÃO HÁ UM NÚMERO DE FRONT-ENDS MAIOR DO QUE ESSE
Object [] o = vec1.toArray();
for (int i = 0; i < vec1.size(); i++) {
if (aux > (Integer) o [i]) {
aux = (Integer) o [i];
}
}
return aux;
}
public static Vector <Integer> build (Integer size, Integer initial) {
Vector <Integer> vec = new Vector <Integer> ();
for (int i = 0; i < size; i++) {
vec.addElement(i + initial);
}
return vec;
}
private static Vector <Integer> join (Vector <Integer> vec1, Vector <Integer> vec2) {
int size = vec1.size() + vec2.size();
Integer x = getMin (vec1);
Vector <Integer> vecfinal = new Vector <Integer> ();
for (int i = x; i < size + x; i++) {
vecfinal.addElement(new Integer (i));
}
return vecfinal;
}
public static FrontEndMapping mergeFrontEndMappings (FrontEndMapping fem1, FrontEndMapping fem2, Vector <String> channelSet) {
FrontEndMapping fem = new FrontEndMapping ();
Object [] keys1 = fem1.getMap().keySet().toArray();
Object [] keys2 = fem2.getMap().keySet().toArray();
Object [] keysall = withoutDuplicates (keys1, keys2);
for (int i = 0; i < keysall.length; i++) {
Vector <Integer> x1 = fem1.get((String) keysall [i]);
Vector <Integer> x2 = fem2.get((String) keysall [i]);
if (channelSet.contains((String)keysall [i])) {
Vector <Integer> x3 = FrontEndMapping.join (x1, x2);
//x1.addAll(x2);
fem.put((String)keysall [i], x3);
}
else {
fem.put((String)keysall [i], (x1.size() > x2.size())? x1 : x2);
}
}
return fem;
}
public void updateMapping (String channel, Vector <Integer> frontends) {
if (this.map.containsKey(channel)) {
this.map.remove(channel);
}
this.map.put(channel, frontends);
}
}