]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/coverage/CoverageBuilder.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / module / coverage / CoverageBuilder.java
diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/coverage/CoverageBuilder.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/module/coverage/CoverageBuilder.java
new file mode 100644 (file)
index 0000000..b3bfcd8
--- /dev/null
@@ -0,0 +1,61 @@
+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