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