1 /*******************************************************************************
2 * Copyright (c) 2010 Association for Decentralized Information Management in
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.databoard.units;
14 import gnu.trove.map.hash.TObjectIntHashMap;
15 import gnu.trove.procedure.TObjectIntProcedure;
17 import org.simantics.databoard.units.internal.library.UnitConversion;
18 import org.simantics.databoard.units.internal.library.UnitLibrary;
19 import org.simantics.databoard.units.internal.parser.UnitParser;
21 public class ConverterCreator extends UnitParser implements TObjectIntProcedure<String> {
24 TObjectIntHashMap<String> exponents = new TObjectIntHashMap<String>();
28 public ConverterCreator(UnitLibrary library) {
29 this.library = library;
33 public void visit(String baseUnit, int exponent) {
34 if(exponents.adjustOrPutValue(baseUnit, exponent, exponent)==0)
35 exponents.remove(baseUnit);
38 public IUnitConverter createConverter() {
39 if(exponents.isEmpty())
40 return IdentityConverter.INSTANCE;
41 TObjectIntHashMap<String> oldExponents = exponents;
42 exponents = new TObjectIntHashMap<String>();
43 oldExponents.forEachEntry(this);
44 if(exponents.isEmpty()) {
45 if(magnitude == 0 && scale == 1.0)
46 return IdentityConverter.INSTANCE;
48 return new LinearConverter(scale * Math.pow(10.0, magnitude));
51 // for(String u : exponents.keys(new String[exponents.size()]))
52 // System.out.println(u + exponents.get(u));
58 public boolean execute(String unit, int exponent) {
59 UnitConversion conversion = library.getConversion(unit);
60 if(conversion == null) {
61 if(exponents.adjustOrPutValue(unit, exponent, exponent)==0)
62 exponents.remove(unit);
65 if(conversion.scale != 1.0)
66 scale *= Math.pow(conversion.scale, exponent);
67 magnitude += conversion.magnitude * exponent;
68 for(int i=0;i<conversion.baseUnits.length;++i) {
69 String u = conversion.baseUnits[i];
70 int exp = conversion.exponents[i] * exponent;
71 if(exponents.adjustOrPutValue(u, exp, exp)==0)