1 package org.djunits.value.vdouble.scalar.base;
2
3 import org.djunits.unit.Unit;
4 import org.djunits.value.Relative;
5 import org.djunits.value.util.ValueUtil;
6 import org.djunits.value.vdouble.scalar.SIScalar;
7
8
9
10
11
12
13
14
15
16
17
18
19
20 public abstract class DoubleScalarRel<U extends Unit<U>, R extends DoubleScalarRel<U, R>>
21 extends DoubleScalar<U, R> implements Relative<U, R>
22 {
23
24 private static final long serialVersionUID = 20150626L;
25
26
27
28
29
30
31 public DoubleScalarRel(final double value, final U unit)
32 {
33 super(unit, unit.isBaseSIUnit() ? value : ValueUtil.expressAsSIUnit(value, unit));
34 }
35
36
37
38
39
40 public DoubleScalarRel(final R value)
41 {
42 super(value.getDisplayUnit(), value.getSI());
43 }
44
45
46
47
48
49
50
51 public abstract R instantiateRel(double value, U unit);
52
53 @Override
54 public final R plus(final R increment)
55 {
56 if (getDisplayUnit().isBaseSIUnit())
57 {
58 return instantiateRel(this.getSI() + increment.getSI(), getDisplayUnit().getStandardUnit());
59 }
60 return getDisplayUnit().equals(increment.getDisplayUnit())
61 ? instantiateRel(getInUnit() + increment.getInUnit(), getDisplayUnit())
62 : instantiateRel(this.getSI() + increment.getSI(), getDisplayUnit().getStandardUnit());
63 }
64
65 @Override
66 public final R minus(final R decrement)
67 {
68 if (getDisplayUnit().isBaseSIUnit())
69 {
70 return instantiateRel(this.getSI() - decrement.getSI(), getDisplayUnit().getStandardUnit());
71 }
72 return getDisplayUnit().equals(decrement.getDisplayUnit())
73 ? instantiateRel(getInUnit() - decrement.getInUnit(), getDisplayUnit())
74 : instantiateRel(this.getSI() - decrement.getSI(), getDisplayUnit().getStandardUnit());
75 }
76
77
78
79
80
81
82 public SIScalar times(final DoubleScalarRel<?, ?> otherScalar)
83 {
84 return DoubleScalar.multiply(this, otherScalar);
85 }
86
87
88
89
90
91 public abstract DoubleScalarRel<?, ?> reciprocal();
92
93
94
95
96
97
98 public SIScalar divide(final DoubleScalarRel<?, ?> otherScalar)
99 {
100 return DoubleScalar.divide(this, otherScalar);
101 }
102
103
104
105
106
107 @Override
108 public R abs()
109 {
110 return instantiateRel(Math.abs(getInUnit()), getDisplayUnit());
111 }
112
113 @Override
114 public R ceil()
115 {
116 return instantiateRel(Math.ceil(getInUnit()), getDisplayUnit());
117 }
118
119 @Override
120 public R floor()
121 {
122 return instantiateRel(Math.floor(getInUnit()), getDisplayUnit());
123 }
124
125 @Override
126 public R rint()
127 {
128 return instantiateRel(Math.rint(getInUnit()), getDisplayUnit());
129 }
130
131 @Override
132 public R neg()
133 {
134 return instantiateRel(-getInUnit(), getDisplayUnit());
135 }
136
137 @Override
138 public R times(final double constant)
139 {
140 return instantiateRel(getInUnit() * constant, getDisplayUnit());
141 }
142
143 @Override
144 public R divide(final double constant)
145 {
146 return instantiateRel(getInUnit() / constant, getDisplayUnit());
147 }
148
149 @Override
150 public R times(final float constant)
151 {
152 return instantiateRel(getInUnit() * constant, getDisplayUnit());
153 }
154
155 @Override
156 public R divide(final float constant)
157 {
158 return instantiateRel(getInUnit() / constant, getDisplayUnit());
159 }
160
161 }