/* * 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.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.trifort.rootbeer.generate.opencl.OpenCLScene; import org.trifort.rootbeer.generate.opencl.tweaks.Tweaks; import soot.SootClass; public class FieldTypeSwitch { private Map<String, String> m_BodyToNameMap; private int m_CurrFunctionNum; public FieldTypeSwitch(){ m_BodyToNameMap = new HashMap<String, String>(); m_CurrFunctionNum = 0; } public String getFunctions() { StringBuilder ret = new StringBuilder(); Iterator<String> iter = m_BodyToNameMap.keySet().iterator(); while(iter.hasNext()){ String body = iter.next(); String function_name = m_BodyToNameMap.get(body); String qual = Tweaks.v().getDeviceFunctionQualifier(); ret.append(qual+" int "+function_name+"(int type){\n"); ret.append(body); ret.append("}\n"); } return ret.toString(); } String typeSwitchName(Map<Integer, List<SootClass>> offsets) { String body = produceBody(offsets); if(m_BodyToNameMap.containsKey(body)){ return m_BodyToNameMap.get(body); } else { String base_name = "org_trifort_type_switch"; base_name += m_CurrFunctionNum; m_CurrFunctionNum++; m_BodyToNameMap.put(body, base_name); return base_name; } } private String produceBody(Map<Integer, List<SootClass>> offsets) { int[] sorted_keys = sortKeys(offsets); StringBuilder ret = new StringBuilder(); ret.append("int offset;\n"); ret.append("switch(type){\n"); for(int key : sorted_keys){ List<SootClass> classes = offsets.get(key); Collections.sort(classes, new NumberedTypeSortComparator(true)); for(SootClass sclass : classes){ ret.append(" case "+OpenCLScene.v().getClassType(sclass)+":\n"); } ret.append(" offset = "+key+";\n"); ret.append(" break;\n"); } ret.append("default:\n"); ret.append(" offset = -1;\n"); ret.append(" break;\n"); ret.append("}\n"); ret.append("return offset;\n"); return ret.toString(); } private int[] sortKeys(Map<Integer, List<SootClass>> offsets) { int[] array = new int[offsets.size()]; int index = 0; Iterator<Integer> iter = offsets.keySet().iterator(); while(iter.hasNext()){ int key = iter.next(); array[index] = key; index++; } Arrays.sort(array); return array; } }