--- /dev/null
+/*******************************************************************************\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