package fr.inria.diversify.codeFragment;
import spoon.reflect.declaration.CtType;
import java.util.*;
/**
* User: Simon
* Date: 13/11/13
* Time: 10:57
*/
public class CodeFragmentList extends LinkedList<CodeFragment> {
protected Map<Integer,Integer> uniqueCodeFragment;
protected Map<Integer,CodeFragment> idToCodeFragment;
public CodeFragmentList(List<CodeFragment> codeFragments) {
uniqueCodeFragment = new HashMap<Integer, Integer>();
idToCodeFragment = new HashMap<Integer,CodeFragment>();
this.addAll(codeFragments);
}
public CodeFragmentList() {
uniqueCodeFragment = new HashMap<Integer, Integer>();
idToCodeFragment = new HashMap<Integer,CodeFragment>();
}
public List<CtType> getAllClasses() {
List<CtType> classes = new ArrayList<CtType>();
for(CodeFragment cf: this)
if(!classes.contains(cf.getSourceClass()))
classes.add(cf.getSourceClass());
return classes;
}
public Collection<CodeFragment> getUniqueCodeFragmentList() {
return idToCodeFragment.values();
}
public boolean add(CodeFragment cf) {
addUniqueStatement(cf);
return super.add(cf);
}
public boolean addAll(Collection<? extends CodeFragment> collection) {
boolean ret = false;
for (CodeFragment cf : collection)
ret = ret || add(cf);
return ret;
}
protected void addUniqueStatement(CodeFragment cf) {
boolean same = false;
for (Integer otherCfId: uniqueCodeFragment.keySet()) {
if(otherCfId == cf.id()) {
same = true;
uniqueCodeFragment.put(otherCfId, uniqueCodeFragment.get(otherCfId)+1);
break;
}
}
if(!same) {
uniqueCodeFragment.put(cf.id(),1);
idToCodeFragment.put(cf.id(), cf);
}
}
}