]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.databoard/src/org/simantics/databoard/units/ConverterCreator.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / units / ConverterCreator.java
diff --git a/bundles/org.simantics.databoard/src/org/simantics/databoard/units/ConverterCreator.java b/bundles/org.simantics.databoard/src/org/simantics/databoard/units/ConverterCreator.java
new file mode 100644 (file)
index 0000000..12748f9
--- /dev/null
@@ -0,0 +1,78 @@
+/*******************************************************************************\r
+ *  Copyright (c) 2010 Association for Decentralized Information Management in\r
+ *  Industry THTH ry.\r
+ *  All rights reserved. This program and the accompanying materials\r
+ *  are made available under the terms of the Eclipse Public License v1.0\r
+ *  which accompanies this distribution, and is available at\r
+ *  http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ *  Contributors:\r
+ *      VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.databoard.units;\r
+\r
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+import gnu.trove.procedure.TObjectIntProcedure;\r
+\r
+import org.simantics.databoard.units.internal.library.UnitConversion;\r
+import org.simantics.databoard.units.internal.library.UnitLibrary;\r
+import org.simantics.databoard.units.internal.parser.UnitParser;\r
+\r
+public class ConverterCreator extends UnitParser implements TObjectIntProcedure<String> {\r
+       \r
+       UnitLibrary library;\r
+       TObjectIntHashMap<String> exponents = new TObjectIntHashMap<String>();\r
+       double scale = 1.0;\r
+       int magnitude = 0;\r
+       \r
+       public ConverterCreator(UnitLibrary library) {\r
+               this.library = library;\r
+       }\r
+       \r
+       @Override\r
+       public void visit(String baseUnit, int exponent) {\r
+               if(exponents.adjustOrPutValue(baseUnit, exponent, exponent)==0)\r
+                       exponents.remove(baseUnit);\r
+       }\r
+       \r
+       public IUnitConverter createConverter() {\r
+               if(exponents.isEmpty())\r
+                       return IdentityConverter.INSTANCE;\r
+               TObjectIntHashMap<String> oldExponents = exponents;\r
+               exponents = new TObjectIntHashMap<String>();\r
+               oldExponents.forEachEntry(this);\r
+               if(exponents.isEmpty()) {\r
+                       if(magnitude == 0 && scale == 1.0)\r
+                               return IdentityConverter.INSTANCE;\r
+                       else\r
+                               return new LinearConverter(scale * Math.pow(10.0, magnitude));\r
+               }\r
+               else {\r
+//                     for(String u : exponents.keys(new String[exponents.size()]))\r
+//                             System.out.println(u + exponents.get(u));\r
+                       return null;\r
+               }\r
+       }\r
+\r
+       @Override\r
+       public boolean execute(String unit, int exponent) {\r
+               UnitConversion conversion = library.getConversion(unit);\r
+               if(conversion == null) {\r
+                       if(exponents.adjustOrPutValue(unit, exponent, exponent)==0)\r
+                               exponents.remove(unit);\r
+               }\r
+               else {\r
+                       if(conversion.scale != 1.0)\r
+                               scale *= Math.pow(conversion.scale, exponent);\r
+                       magnitude += conversion.magnitude * exponent;\r
+                       for(int i=0;i<conversion.baseUnits.length;++i) {\r
+                               String u = conversion.baseUnits[i];\r
+                               int exp = conversion.exponents[i] * exponent;\r
+                               if(exponents.adjustOrPutValue(u, exp, exp)==0)\r
+                                       exponents.remove(u);\r
+                       }\r
+               }\r
+               return true;\r
+       }\r
+       \r
+}\r