1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
@startuml
abstract class Unit {
-unitBase : ObjectProduct<BaseUnit>
-nameSymbol : NameSymbol
-dimension : ObjectProduct<BaseDimension>
+{static} fromConversionFunctions(ObjectProduct<BaseUnit>, DoubleUnaryOperator, DoubleUnaryOperator) : Unit
#Unit(ObjectProduct<BaseUnit>, NameSymbol) : Unit
~Unit(NameSymbol) : Unit
+canConvertTo(Unit) : boolean
+convertTo(Unit, double) : double
#convertFromBase(double) : double
#convertToBase(double) : double
+isMetric() : boolean
+withName(NameSymbol) : Unit
}
class BaseUnit {
-dimension : BaseDimension
-BaseUnit(BaseDimension, String, String, Set<String) : BaseUnit
+asLinearUnit() : LinearUnit
}
class LinearUnit {
-conversionFactor : double
+{static} valueOf(ObjectProduct<BaseUnit>, double) : LinearUnit
-LinearUnit(ObjectProduct<BaseUnit>, double, NameSymbol) : LinearUnit
+convertTo(LinearUnit, UncertainDouble) : UncertainDouble
+plus(LinearUnit) : LinearUnit
+minus(LinearUnit) : LinearUnit
+times(LinearUnit) : LinearUnit
+dividedBy(LinearUnit) : LinearUnit
+times(double) : LinearUnit
+dividedBy(double) : LinearUnit
+toExponent(int) : LinearUnit
+withPrefix(UnitPrefix) : LinearUnit
+withName(NameSymbol) : LinearUnit
}
class UnitPrefix {
-multiplier : double
+times(double) : UnitPrefix
+dividedBy(double) : UnitPrefix
}
class UnitDatabase {
-prefixlessUnits : Map<String, Unit>
-units : Map<String, Unit>
-prefixes : Map<String, UnitPrefix>
-dimensions : Map<String, ObjectProduct<BaseDimension>>
-unitExpressionParser : ExpressionParser<LinearUnit>
+loadUnitsFile(Path)
-addUnitOrPrefixFromLine(String, long)
+addUnit(String, Unit)
+containsUnitName(String) : boolean
+evaluateUnitExpression(String) : LinearUnitValue
+getUnit(String) : Unit
}
class UnitValue {
-unit : Unit
-value : double
+canConvertTo(Unit) : boolean
+convertTo(Unit) : UnitValue
+convertToLinear(LinearUnit) : LinearUnitValue
}
Unit <|-- BaseUnit
Unit --* BaseUnit
BaseDimension -o BaseUnit
Unit <|-- LinearUnit
Unit *- SI
UnitValue --o Unit
UnitDatabase --* Unit
UnitDatabase --* UnitPrefix
UnitDatabase --* BaseDimension
UnitDatabase -* "4" ExpressionParser
@enduml
|