]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/units/ConverterCreator.java
Improved Bindings.getBinding(Class) caching for Datatype.class
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / units / ConverterCreator.java
1 /*******************************************************************************
2  *  Copyright (c) 2010 Association for Decentralized Information Management in
3  *  Industry THTH ry.
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
8  *
9  *  Contributors:
10  *      VTT Technical Research Centre of Finland - initial API and implementation
11  *******************************************************************************/
12 package org.simantics.databoard.units;
13
14 import gnu.trove.map.hash.TObjectIntHashMap;
15 import gnu.trove.procedure.TObjectIntProcedure;
16
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;
20
21 public class ConverterCreator extends UnitParser implements TObjectIntProcedure<String> {
22         
23         UnitLibrary library;
24         TObjectIntHashMap<String> exponents = new TObjectIntHashMap<String>();
25         double scale = 1.0;
26         int magnitude = 0;
27         
28         public ConverterCreator(UnitLibrary library) {
29                 this.library = library;
30         }
31         
32         @Override
33         public void visit(String baseUnit, int exponent) {
34                 if(exponents.adjustOrPutValue(baseUnit, exponent, exponent)==0)
35                         exponents.remove(baseUnit);
36         }
37         
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;
47                         else
48                                 return new LinearConverter(scale * Math.pow(10.0, magnitude));
49                 }
50                 else {
51 //                      for(String u : exponents.keys(new String[exponents.size()]))
52 //                              System.out.println(u + exponents.get(u));
53                         return null;
54                 }
55         }
56
57         @Override
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);
63                 }
64                 else {
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)
72                                         exponents.remove(u);
73                         }
74                 }
75                 return true;
76         }
77         
78 }