RobotCore 1.0
WPILib port to raspberry Pi
Loading...
Searching...
No Matches
Unit.java
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5package org.wpilib.units;
6
7import java.util.Objects;
8
15public abstract class Unit {
16 private final UnaryFunction m_toBaseConverter;
17 private final UnaryFunction m_fromBaseConverter;
18
19 private final Unit m_baseUnit;
20
21 private final String m_name;
22 private final String m_symbol;
23
24 private final Measure<?> m_zero;
25 private final Measure<?> m_one;
26
37 @SuppressWarnings("this-escape")
38 protected Unit(
39 Unit baseUnit,
40 UnaryFunction toBaseConverter,
41 UnaryFunction fromBaseConverter,
42 String name,
43 String symbol) {
44 m_baseUnit = baseUnit == null ? this : baseUnit;
45 m_toBaseConverter = Objects.requireNonNull(toBaseConverter);
46 m_fromBaseConverter = Objects.requireNonNull(fromBaseConverter);
47 m_name = Objects.requireNonNull(name);
48 m_symbol = Objects.requireNonNull(symbol);
49
50 m_zero = of(0);
51 m_one = of(1);
52 }
53
64 protected Unit(Unit baseUnit, double baseUnitEquivalent, String name, String symbol) {
65 this(baseUnit, x -> x * baseUnitEquivalent, x -> x / baseUnitEquivalent, name, symbol);
66 }
67
76 public abstract Measure<?> of(double magnitude);
77
86 public abstract Measure<?> ofBaseUnits(double baseUnitMagnitude);
87
95 public Measure<?> zero() {
96 return m_zero;
97 }
98
106 public Measure<?> one() {
107 return m_one;
108 }
109
117 public abstract Unit per(TimeUnit time);
118
137 public Unit getBaseUnit() {
138 return m_baseUnit;
139 }
140
146 public boolean isBaseUnit() {
147 return this.equals(m_baseUnit);
148 }
149
156 public double fromBaseUnits(double valueInBaseUnits) {
157 return m_fromBaseConverter.apply(valueInBaseUnits);
158 }
159
166 public double toBaseUnits(double valueInNativeUnits) {
167 return m_toBaseConverter.apply(valueInNativeUnits);
168 }
169
177 return m_toBaseConverter;
178 }
179
187 return m_fromBaseConverter;
188 }
189
198 public boolean equivalent(Unit other) {
199 if (!getClass().equals(other.getClass())) {
200 // different unit types, not compatible
201 return false;
202 }
203
204 double arbitrary = 16_777.214; // 2^24 / 1e3
205
206 return Math.abs(
207 this.m_fromBaseConverter.apply(arbitrary)
208 - other.m_fromBaseConverter.apply(arbitrary))
210 && Math.abs(
211 this.m_toBaseConverter.apply(arbitrary) - other.m_toBaseConverter.apply(arbitrary))
213 }
214
215 @Override
216 public boolean equals(Object o) {
217 return this == o
218 || o instanceof Unit that
219 && m_name.equals(that.m_name)
220 && m_symbol.equals(that.m_symbol)
221 && this.equivalent(that);
222 }
223
224 @Override
225 public int hashCode() {
226 return Objects.hash(m_toBaseConverter, m_fromBaseConverter, m_name, m_symbol);
227 }
228
234 public String name() {
235 return m_name;
236 }
237
243 public String symbol() {
244 return m_symbol;
245 }
246
247 @Override
248 public String toString() {
249 return name();
250 }
251}
Measure<?> zero()
Definition Unit.java:95
Measure<?> one()
Definition Unit.java:106
Unit(Unit baseUnit, double baseUnitEquivalent, String name, String symbol)
Definition Unit.java:64
double toBaseUnits(double valueInNativeUnits)
Definition Unit.java:166
abstract Measure<?> of(double magnitude)
boolean isBaseUnit()
Definition Unit.java:146
UnaryFunction getConverterToBase()
Definition Unit.java:176
boolean equivalent(Unit other)
Definition Unit.java:198
UnaryFunction getConverterFromBase()
Definition Unit.java:186
abstract Measure<?> ofBaseUnits(double baseUnitMagnitude)
Unit(Unit baseUnit, UnaryFunction toBaseConverter, UnaryFunction fromBaseConverter, String name, String symbol)
Definition Unit.java:38
abstract Unit per(TimeUnit time)
double fromBaseUnits(double valueInBaseUnits)
Definition Unit.java:156
double apply(double input)