RobotCore 1.0
WPILib port to raspberry Pi
Loading...
Searching...
No Matches
PerUnit.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;
8import org.wpilib.units.measure.Per;
9
17public class PerUnit<N extends Unit, D extends Unit> extends Unit {
18 private final N m_numerator;
19 private final D m_denominator;
20
25 @SuppressWarnings("rawtypes")
26 private static final CombinatoryUnitCache<Unit, Unit, PerUnit> cache =
27 new CombinatoryUnitCache<>(PerUnit::new);
28
36 private PerUnit(N numerator, D denominator) {
37 super(
38 numerator.isBaseUnit() && denominator.isBaseUnit()
39 ? null
40 : combine(numerator.getBaseUnit(), denominator.getBaseUnit()),
41 numerator.toBaseUnits(1) / denominator.toBaseUnits(1),
42 numerator.name() + " per " + denominator.name(),
43 numerator.symbol() + "/" + denominator.symbol());
44 m_numerator = numerator;
45 m_denominator = denominator;
46 }
47
57 protected PerUnit(PerUnit<N, D> baseUnit, N numerator, D denominator) {
58 super(
59 baseUnit,
60 numerator.toBaseUnits(1) / denominator.toBaseUnits(1),
61 numerator.name() + " per " + denominator.name(),
62 numerator.symbol() + "/" + denominator.symbol());
63 m_numerator = numerator;
64 m_denominator = denominator;
65 }
66
68 PerUnit(
69 PerUnit<N, D> baseUnit,
70 UnaryFunction toBaseConverter,
71 UnaryFunction fromBaseConverter,
72 String name,
73 String symbol) {
74 super(baseUnit, toBaseConverter, fromBaseConverter, name, symbol);
75 m_numerator = getBaseUnit().numerator();
76 m_denominator = getBaseUnit().denominator();
77 }
78
92 @SuppressWarnings("unchecked")
93 public static <N extends Unit, D extends Unit> PerUnit<N, D> combine(N numerator, D denominator) {
94 return cache.combine(numerator, denominator);
95 }
96
97 @Override
98 @SuppressWarnings("unchecked")
99 public PerUnit<N, D> getBaseUnit() {
100 return (PerUnit<N, D>) super.getBaseUnit();
101 }
102
108 public N numerator() {
109 return m_numerator;
110 }
111
117 public D denominator() {
118 return m_denominator;
119 }
120
126 @SuppressWarnings("unchecked")
127 public PerUnit<D, N> reciprocal() {
128 if (m_numerator instanceof TimeUnit t) {
129 // Dividing by time, return a velocity
130 return (PerUnit<D, N>) VelocityUnit.combine(m_denominator, t);
131 } else {
132 // Generic case
133 return combine(m_denominator, m_numerator);
134 }
135 }
136
143 public N mult(D denom) {
144 if (denom.equivalent(denominator())) {
145 return numerator();
146 }
147
148 return Units.derive(numerator())
149 .toBase(denom.getConverterToBase().div(denominator().getConverterToBase()))
150 .fromBase(denom.getConverterFromBase().div(denominator().getConverterFromBase()))
151 .named(name() + " " + denom.name())
152 .symbol(symbol() + "-" + denom.symbol())
153 .make();
154 }
155
166 @Override
167 public Measure<? extends PerUnit<N, D>> of(double magnitude) {
168 return ofNative(magnitude);
169 }
170
181 @Override
182 public Measure<? extends PerUnit<N, D>> ofBaseUnits(double baseUnitMagnitude) {
183 return ofNativeBaseUnits(baseUnitMagnitude);
184 }
185
194 public final Per<N, D> ofNative(double magnitude) {
195 return new Per<>(magnitude, toBaseUnits(magnitude), this);
196 }
197
206 public final Per<N, D> ofNativeBaseUnits(double baseUnitMagnitude) {
207 return new Per<>(fromBaseUnits(baseUnitMagnitude), baseUnitMagnitude, this);
208 }
209
210 @Override
211 @SuppressWarnings("unchecked")
212 public Measure<? extends PerUnit<N, D>> zero() {
213 return (Measure<? extends PerUnit<N, D>>) super.zero();
214 }
215
216 @Override
217 @SuppressWarnings("unchecked")
218 public Measure<? extends PerUnit<N, D>> one() {
219 return (Measure<? extends PerUnit<N, D>>) super.one();
220 }
221
222 @Override
223 public Unit per(TimeUnit time) {
224 return VelocityUnit.combine(this, time);
225 }
226
234 public double convertFrom(double magnitude, PerUnit<? extends N, ? extends D> otherUnit) {
235 return fromBaseUnits(otherUnit.toBaseUnits(magnitude));
236 }
237
238 @Override
239 public boolean equals(Object o) {
240 if (this == o) {
241 return true;
242 }
243 if (o == null || getClass() != o.getClass()) {
244 return false;
245 }
246 if (!super.equals(o)) {
247 return false;
248 }
249 PerUnit<?, ?> perUnit = (PerUnit<?, ?>) o;
250 return Objects.equals(m_numerator, perUnit.m_numerator)
251 && Objects.equals(m_denominator, perUnit.m_denominator);
252 }
253
254 @Override
255 public int hashCode() {
256 return Objects.hash(super.hashCode(), m_numerator, m_denominator);
257 }
258}
CombinatoryUnitCache(BiFunction<? super A, ? super B, ? extends Out > constructor)
static< N extends Unit, D extends Unit > PerUnit< N, D > combine(N numerator, D denominator)
Definition PerUnit.java:93
PerUnit< D, N > reciprocal()
Definition PerUnit.java:127
PerUnit< N, D > getBaseUnit()
Definition PerUnit.java:99
final Per< N, D > ofNativeBaseUnits(double baseUnitMagnitude)
Definition PerUnit.java:206
Measure<? extends PerUnit< N, D > > zero()
Definition PerUnit.java:212
Measure<? extends PerUnit< N, D > > ofBaseUnits(double baseUnitMagnitude)
Definition PerUnit.java:182
Unit per(TimeUnit time)
Definition PerUnit.java:223
Measure<? extends PerUnit< N, D > > of(double magnitude)
Definition PerUnit.java:167
PerUnit(PerUnit< N, D > baseUnit, N numerator, D denominator)
Definition PerUnit.java:57
Measure<? extends PerUnit< N, D > > one()
Definition PerUnit.java:218
double convertFrom(double magnitude, PerUnit<? extends N, ? extends D > otherUnit)
Definition PerUnit.java:234
final Per< N, D > ofNative(double magnitude)
Definition PerUnit.java:194
double toBaseUnits(double valueInNativeUnits)
Definition Unit.java:166
UnaryFunction getConverterToBase()
Definition Unit.java:176
UnaryFunction getConverterFromBase()
Definition Unit.java:186
Unit(Unit baseUnit, UnaryFunction toBaseConverter, UnaryFunction fromBaseConverter, String name, String symbol)
Definition Unit.java:38
double fromBaseUnits(double valueInBaseUnits)
Definition Unit.java:156
static< D extends Unit > VelocityUnit< D > combine(D unit, TimeUnit period)