--- /dev/null
+package org.simantics.scl.compiler.module.coverage;\r
+\r
+import org.simantics.scl.compiler.module.Module;\r
+import org.simantics.scl.runtime.profiling.BranchPoint;\r
+\r
+import gnu.trove.map.hash.THashMap;\r
+import gnu.trove.procedure.TObjectObjectProcedure;\r
+\r
+public class CoverageBuilder {\r
+ THashMap<String, THashMap<String, BranchPoint[]>> combined =\r
+ new THashMap<String, THashMap<String, BranchPoint[]>>();\r
+ \r
+ public void addCoverage(Module module) {\r
+ THashMap<String, BranchPoint[]> branchPointMap = module.getBranchPoints();\r
+ if(branchPointMap == null)\r
+ return;\r
+ THashMap<String, BranchPoint[]> oldBranchPointMap = combined.get(module.getName());\r
+ if(oldBranchPointMap == null) {\r
+ oldBranchPointMap = new THashMap<String, BranchPoint[]>();\r
+ combined.put(module.getName(), oldBranchPointMap);\r
+ }\r
+ THashMap<String, BranchPoint[]> oldBranchPointMap_ = oldBranchPointMap;\r
+ branchPointMap.forEachEntry(new TObjectObjectProcedure<String, BranchPoint[]>() {\r
+ @Override\r
+ public boolean execute(String name, BranchPoint[] branchPoints) {\r
+ BranchPoint[] oldBranchPoints = oldBranchPointMap_.get(name);\r
+ if(oldBranchPoints == null)\r
+ oldBranchPointMap_.put(name, branchPoints);\r
+ else\r
+ combineCounters(oldBranchPoints, branchPoints);\r
+ return true;\r
+ }\r
+ });\r
+ }\r
+ \r
+ private static void combineCounters(BranchPoint[] oldBranchPoints, BranchPoint[] branchPoints) {\r
+ if(oldBranchPoints.length != branchPoints.length)\r
+ throw new IllegalArgumentException("Incompatible branch points.");\r
+ for(int i=0;i<branchPoints.length;++i) {\r
+ BranchPoint oldBP = oldBranchPoints[i];\r
+ BranchPoint newBP = branchPoints[i];\r
+ if(oldBP.location != newBP.location)\r
+ throw new IllegalArgumentException("Incompatible branch points.");\r
+ oldBP.visitCounter += newBP.visitCounter;\r
+ combineCounters(oldBP.children, newBP.children);\r
+ }\r
+ }\r
+ \r
+ public CombinedCoverage getCoverage() {\r
+ THashMap<String,ModuleCoverage> moduleCoverages =\r
+ new THashMap<String,ModuleCoverage>();\r
+ combined.forEachEntry(new TObjectObjectProcedure<String, THashMap<String, BranchPoint[]>>() {\r
+ @Override\r
+ public boolean execute(String name, THashMap<String, BranchPoint[]> branchPoints) {\r
+ moduleCoverages.put(name, CoverageUtils.getCoverage(name, branchPoints));\r
+ return true;\r
+ }\r
+ });\r
+ return CoverageUtils.combineCoverages(moduleCoverages);\r
+ }\r
+}\r