]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 /*******************************************************************************\r
2  *  Copyright (c) 2010 Association for Decentralized Information Management in\r
3  *  Industry THTH ry.\r
4  *  All rights reserved. This program and the accompanying materials\r
5  *  are made available under the terms of the Eclipse Public License v1.0\r
6  *  which accompanies this distribution, and is available at\r
7  *  http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  *  Contributors:\r
10  *      VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.databoard.units;\r
13 \r
14 import gnu.trove.map.hash.TObjectIntHashMap;\r
15 import gnu.trove.procedure.TObjectIntProcedure;\r
16 \r
17 import org.simantics.databoard.units.internal.library.UnitConversion;\r
18 import org.simantics.databoard.units.internal.library.UnitLibrary;\r
19 import org.simantics.databoard.units.internal.parser.UnitParser;\r
20 \r
21 public class ConverterCreator extends UnitParser implements TObjectIntProcedure<String> {\r
22         \r
23         UnitLibrary library;\r
24         TObjectIntHashMap<String> exponents = new TObjectIntHashMap<String>();\r
25         double scale = 1.0;\r
26         int magnitude = 0;\r
27         \r
28         public ConverterCreator(UnitLibrary library) {\r
29                 this.library = library;\r
30         }\r
31         \r
32         @Override\r
33         public void visit(String baseUnit, int exponent) {\r
34                 if(exponents.adjustOrPutValue(baseUnit, exponent, exponent)==0)\r
35                         exponents.remove(baseUnit);\r
36         }\r
37         \r
38         public IUnitConverter createConverter() {\r
39                 if(exponents.isEmpty())\r
40                         return IdentityConverter.INSTANCE;\r
41                 TObjectIntHashMap<String> oldExponents = exponents;\r
42                 exponents = new TObjectIntHashMap<String>();\r
43                 oldExponents.forEachEntry(this);\r
44                 if(exponents.isEmpty()) {\r
45                         if(magnitude == 0 && scale == 1.0)\r
46                                 return IdentityConverter.INSTANCE;\r
47                         else\r
48                                 return new LinearConverter(scale * Math.pow(10.0, magnitude));\r
49                 }\r
50                 else {\r
51 //                      for(String u : exponents.keys(new String[exponents.size()]))\r
52 //                              System.out.println(u + exponents.get(u));\r
53                         return null;\r
54                 }\r
55         }\r
56 \r
57         @Override\r
58         public boolean execute(String unit, int exponent) {\r
59                 UnitConversion conversion = library.getConversion(unit);\r
60                 if(conversion == null) {\r
61                         if(exponents.adjustOrPutValue(unit, exponent, exponent)==0)\r
62                                 exponents.remove(unit);\r
63                 }\r
64                 else {\r
65                         if(conversion.scale != 1.0)\r
66                                 scale *= Math.pow(conversion.scale, exponent);\r
67                         magnitude += conversion.magnitude * exponent;\r
68                         for(int i=0;i<conversion.baseUnits.length;++i) {\r
69                                 String u = conversion.baseUnits[i];\r
70                                 int exp = conversion.exponents[i] * exponent;\r
71                                 if(exponents.adjustOrPutValue(u, exp, exp)==0)\r
72                                         exponents.remove(u);\r
73                         }\r
74                 }\r
75                 return true;\r
76         }\r
77         \r
78 }\r