1 package org.opentrafficsim.core.value.vfloat.scalar;
2
3 import org.opentrafficsim.core.unit.SICoefficients;
4 import org.opentrafficsim.core.unit.SIUnit;
5 import org.opentrafficsim.core.unit.Unit;
6 import org.opentrafficsim.core.value.Absolute;
7 import org.opentrafficsim.core.value.Format;
8 import org.opentrafficsim.core.value.Relative;
9 import org.opentrafficsim.core.value.Scalar;
10 import org.opentrafficsim.core.value.ValueUtil;
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 public abstract class FloatScalar<U extends Unit<U>> extends Scalar<U>
26 {
27
28 private static final long serialVersionUID = 20150309L;
29
30
31 private float valueSI;
32
33
34
35
36
37 protected FloatScalar(final U unit)
38 {
39 super(unit);
40
41 }
42
43
44
45
46 public static class Abs<U extends Unit<U>> extends FloatScalar<U> implements Absolute, Comparable<Abs<U>>
47 {
48
49 private static final long serialVersionUID = 20150309L;
50
51
52
53
54
55
56 public Abs(final float value, final U unit)
57 {
58 super(unit);
59
60 initialize(value);
61 }
62
63
64
65
66
67 public Abs(final FloatScalar.Abs<U> value)
68 {
69 super(value.getUnit());
70
71 initialize(value);
72 }
73
74
75
76
77
78 public Abs(final MutableFloatScalar.Abs<U> value)
79 {
80 super(value.getUnit());
81
82 initialize(value);
83 }
84
85
86 @Override
87 public final MutableFloatScalar.Abs<U> mutable()
88 {
89 return new MutableFloatScalar.Abs<U>(this);
90 }
91
92
93 @Override
94 public final int compareTo(final Abs<U> o)
95 {
96 return new Float(getSI()).compareTo(o.getSI());
97 }
98
99
100 @Override
101 public final FloatScalar.Abs<U> copy()
102 {
103 return this;
104 }
105
106 }
107
108
109
110
111 public static class Rel<U extends Unit<U>> extends FloatScalar<U> implements Relative, Comparable<Rel<U>>
112 {
113
114 private static final long serialVersionUID = 20150309L;
115
116
117
118
119
120
121 public Rel(final float value, final U unit)
122 {
123 super(unit);
124
125 initialize(value);
126 }
127
128
129
130
131
132 public Rel(final FloatScalar.Rel<U> value)
133 {
134 super(value.getUnit());
135
136 initialize(value);
137 }
138
139
140
141
142
143 public Rel(final MutableFloatScalar.Rel<U> value)
144 {
145 super(value.getUnit());
146
147 initialize(value);
148 }
149
150
151 @Override
152 public final MutableFloatScalar.Rel<U> mutable()
153 {
154 return new MutableFloatScalar.Rel<U>(this);
155 }
156
157
158 @Override
159 public final int compareTo(final Rel<U> o)
160 {
161 return new Float(getSI()).compareTo(o.getSI());
162 }
163
164
165 @Override
166 public final FloatScalar.Rel<U> copy()
167 {
168 return this;
169 }
170
171 }
172
173
174
175
176
177
178 public abstract MutableFloatScalar<U> mutable();
179
180
181
182
183
184 protected final void initialize(final float value)
185 {
186 if (this.getUnit().equals(this.getUnit().getStandardUnit()))
187 {
188 setValueSI(value);
189 }
190 else
191 {
192 setValueSI((float) expressAsSIUnit(value));
193 }
194 }
195
196
197
198
199
200 protected final void initialize(final FloatScalar<U> value)
201 {
202 setValueSI(value.getSI());
203 }
204
205
206
207
208
209 public final float getSI()
210 {
211 return this.valueSI;
212 }
213
214
215
216
217
218 protected final void setValueSI(final float value)
219 {
220 this.valueSI = value;
221 }
222
223
224
225
226
227 public final float getInUnit()
228 {
229 return (float) expressAsSpecifiedUnit(getSI());
230 }
231
232
233
234
235
236
237 public final float getInUnit(final U targetUnit)
238 {
239 return (float) ValueUtil.expressAsUnit(getSI(), targetUnit);
240 }
241
242
243
244
245
246
247 @Override
248 public final int intValue()
249 {
250 return Math.round(getSI());
251 }
252
253
254 @Override
255 public final long longValue()
256 {
257 return Math.round(getSI());
258 }
259
260
261 @Override
262 public final float floatValue()
263 {
264 return getSI();
265 }
266
267
268 @Override
269 public final double doubleValue()
270 {
271 return getSI();
272 }
273
274
275 @Override
276 public final String toString()
277 {
278 return toString(getUnit(), false, true);
279 }
280
281
282
283
284
285
286 public final String toString(final U displayUnit)
287 {
288 return toString(displayUnit, false, true);
289 }
290
291
292
293
294
295
296
297 public final String toString(final boolean verbose, final boolean withUnit)
298 {
299 return toString(getUnit(), verbose, withUnit);
300 }
301
302
303
304
305
306
307
308
309 public final String toString(final U displayUnit, final boolean verbose, final boolean withUnit)
310 {
311 StringBuffer buf = new StringBuffer();
312 if (verbose)
313 {
314 if (this instanceof MutableFloatScalar)
315 {
316 buf.append("Mutable ");
317 if (this instanceof MutableFloatScalar.Abs)
318 {
319 buf.append("Abs ");
320 }
321 else if (this instanceof MutableFloatScalar.Rel)
322 {
323 buf.append("Rel ");
324 }
325 else
326 {
327 buf.append("??? ");
328 }
329 }
330 else
331 {
332 buf.append("Immutable ");
333 if (this instanceof FloatScalar.Abs)
334 {
335 buf.append("Abs ");
336 }
337 else if (this instanceof FloatScalar.Rel)
338 {
339 buf.append("Rel ");
340 }
341 else
342 {
343 buf.append("??? ");
344 }
345 }
346 }
347 float f = (float) ValueUtil.expressAsUnit(getSI(), displayUnit);
348 buf.append(Format.format(f));
349 if (withUnit)
350 {
351 buf.append(displayUnit.getAbbreviation());
352 }
353 return buf.toString();
354 }
355
356
357 @Override
358 public final int hashCode()
359 {
360 final int prime = 31;
361 int result = 1;
362 result = prime * result + Float.floatToIntBits(this.valueSI);
363 return result;
364 }
365
366
367 @Override
368 public final boolean equals(final Object obj)
369 {
370 if (this == obj)
371 {
372 return true;
373 }
374 if (obj == null)
375 {
376 return false;
377 }
378 if (!(obj instanceof FloatScalar))
379 {
380 return false;
381 }
382 FloatScalar<?> other = (FloatScalar<?>) obj;
383
384 if (this.isAbsolute() != other.isAbsolute() || this.isRelative() != other.isRelative())
385 {
386 return false;
387 }
388
389 if (!this.getUnit().getStandardUnit().equals(other.getUnit().getStandardUnit()))
390 {
391 return false;
392 }
393 if (Float.floatToIntBits(this.valueSI) != Float.floatToIntBits(other.valueSI))
394 {
395 return false;
396 }
397 return true;
398 }
399
400
401
402
403
404
405
406
407
408
409
410
411
412 public static <U extends Unit<U>> MutableFloatScalar.Abs<U> plus(final FloatScalar.Abs<U> left,
413 final FloatScalar.Rel<U> right)
414 {
415 MutableFloatScalar.Abs<U> result = new MutableFloatScalar.Abs<U>(left);
416 result.incrementByImpl(right);
417 return result;
418 }
419
420
421
422
423
424
425
426
427
428 public static <U extends Unit<U>> MutableFloatScalar.Rel<U> plus(final FloatScalar.Rel<U> left,
429 final FloatScalar.Rel<U> right)
430 {
431 MutableFloatScalar.Rel<U> result = new MutableFloatScalar.Rel<U>(left);
432 result.incrementByImpl(right);
433 return result;
434 }
435
436
437
438
439
440
441
442
443
444 public static <U extends Unit<U>> MutableFloatScalar.Abs<U> minus(final FloatScalar.Abs<U> left,
445 final FloatScalar.Rel<U> right)
446 {
447 MutableFloatScalar.Abs<U> result = new MutableFloatScalar.Abs<U>(left);
448 result.decrementByImpl(right);
449 return result;
450 }
451
452
453
454
455
456
457
458
459
460 public static <U extends Unit<U>> MutableFloatScalar.Rel<U> minus(final FloatScalar.Rel<U> left,
461 final FloatScalar.Rel<U> right)
462 {
463 MutableFloatScalar.Rel<U> result = new MutableFloatScalar.Rel<U>(left);
464 result.decrementByImpl(right);
465 return result;
466 }
467
468
469
470
471
472
473
474
475
476 public static <U extends Unit<U>> MutableFloatScalar.Rel<U> minus(final FloatScalar.Abs<U> valueAbs1,
477 final FloatScalar.Abs<U> valueAbs2)
478 {
479 MutableFloatScalar.Rel<U> result = new MutableFloatScalar.Rel<U>(valueAbs1.getInUnit(), valueAbs1.getUnit());
480 result.decrementBy(valueAbs2);
481 return result;
482 }
483
484
485
486
487
488
489
490 public static MutableFloatScalar.Abs<SIUnit> multiply(final FloatScalar.Abs<?> left, final FloatScalar.Abs<?> right)
491 {
492 SIUnit targetUnit =
493 Unit.lookupOrCreateSIUnitWithSICoefficients(SICoefficients.multiply(left.getUnit().getSICoefficients(),
494 right.getUnit().getSICoefficients()).toString());
495 return new MutableFloatScalar.Abs<SIUnit>(left.getSI() * right.getSI(), targetUnit);
496 }
497
498
499
500
501
502
503
504 public static MutableFloatScalar.Rel<SIUnit> multiply(final FloatScalar.Rel<?> left, final FloatScalar.Rel<?> right)
505 {
506 SIUnit targetUnit =
507 Unit.lookupOrCreateSIUnitWithSICoefficients(SICoefficients.multiply(left.getUnit().getSICoefficients(),
508 right.getUnit().getSICoefficients()).toString());
509 return new MutableFloatScalar.Rel<SIUnit>(left.getSI() * right.getSI(), targetUnit);
510 }
511
512
513
514
515
516
517
518 public static MutableFloatScalar.Abs<SIUnit> divide(final FloatScalar.Abs<?> left, final FloatScalar.Abs<?> right)
519 {
520 SIUnit targetUnit =
521 Unit.lookupOrCreateSIUnitWithSICoefficients(SICoefficients.divide(left.getUnit().getSICoefficients(),
522 right.getUnit().getSICoefficients()).toString());
523 return new MutableFloatScalar.Abs<SIUnit>(left.getSI() / right.getSI(), targetUnit);
524 }
525
526
527
528
529
530
531
532 public static MutableFloatScalar.Rel<SIUnit> divide(final FloatScalar.Rel<?> left, final FloatScalar.Rel<?> right)
533 {
534 SIUnit targetUnit =
535 Unit.lookupOrCreateSIUnitWithSICoefficients(SICoefficients.divide(left.getUnit().getSICoefficients(),
536 right.getUnit().getSICoefficients()).toString());
537 return new MutableFloatScalar.Rel<SIUnit>(left.getSI() / right.getSI(), targetUnit);
538 }
539
540
541
542
543
544
545
546
547
548 public static <U extends Unit<U>> MutableFloatScalar.Abs<U> interpolate(final FloatScalar.Abs<U> zero,
549 final FloatScalar.Abs<U> one, final float ratio)
550 {
551 MutableFloatScalar.Abs<U> result = zero.mutable();
552 result.setSI(result.getSI() * (1 - ratio) + one.getSI() * ratio);
553 return result;
554 }
555
556
557
558
559
560
561
562
563
564 public static <U extends Unit<U>> MutableFloatScalar.Rel<U> interpolate(final FloatScalar.Rel<U> zero,
565 final FloatScalar.Rel<U> one, final float ratio)
566 {
567 MutableFloatScalar.Rel<U> result = zero.mutable();
568 result.setSI(result.getSI() * (1 - ratio) + one.getSI() * ratio);
569 return result;
570 }
571
572 }