/*
* Copyright 2012 Phil Pratt-Szeliga and other contributors
* http://chirrup.org/
*
* See the file LICENSE for copying permission.
*/
package org.trifort.rootbeer.generate.opencl.fields;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import soot.SootClass;
public class CompositeField {
private List<OpenCLField> m_RefFields;
private List<OpenCLField> m_NonRefFields;
private Map<SootClass, List<OpenCLField>> m_RefFieldsByClass;
private Map<SootClass, List<OpenCLField>> m_NonRefFieldsByClass;
private List<SootClass> m_Classes;
public CompositeField(){
m_RefFields = new ArrayList<OpenCLField>();
m_NonRefFields = new ArrayList<OpenCLField>();
m_RefFieldsByClass = new HashMap<SootClass, List<OpenCLField>>();
m_NonRefFieldsByClass = new HashMap<SootClass, List<OpenCLField>>();
m_Classes = new ArrayList<SootClass>();
}
public void addRefField(OpenCLField field, SootClass soot_class){
addField(m_RefFieldsByClass, soot_class, field);
m_RefFields.add(field);
}
public void addNonRefField(OpenCLField field, SootClass soot_class) {
addField(m_NonRefFieldsByClass, soot_class, field);
m_NonRefFields.add(field);
}
public List<OpenCLField> getRefFields(){
return m_RefFields;
}
public List<OpenCLField> getNonRefFields(){
return m_NonRefFields;
}
public List<OpenCLField> getRefFieldsByClass(SootClass soot_class){
List<OpenCLField> ret = m_RefFieldsByClass.get(soot_class);
if(ret == null)
ret = new ArrayList<OpenCLField>();
return ret;
}
public List<OpenCLField> getNonRefFieldsByClass(SootClass soot_class){
List<OpenCLField> ret = m_NonRefFieldsByClass.get(soot_class);
if(ret == null)
ret = new ArrayList<OpenCLField>();
return ret;
}
public List<SootClass> getClasses(){
return m_Classes;
}
private void addField(Map<SootClass, List<OpenCLField>> fields_by_class, SootClass soot_class, OpenCLField field) {
if(fields_by_class.containsKey(soot_class)){
List<OpenCLField> lst = fields_by_class.get(soot_class);
lst.add(field);
} else {
List<OpenCLField> lst = new ArrayList<OpenCLField>();
lst.add(field);
fields_by_class.put(soot_class, lst);
}
if(m_Classes.contains(soot_class) == false){
m_Classes.add(soot_class);
}
}
public void sort() {
Collections.sort(m_Classes, new NumberedTypeSortComparator(true));
}
}