mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-30 02:31:44 +00:00
[wpiunits] Change units to track their base unit, instead of their base class (#6342)
Unit objects now have a reference to the base unit from which they're derived. Constructing a unit object without specifying a base unit implicitly signifies that it's its own base unit, eg new Angle(null, 1, "Radian", "rad") would be the base angle unit of radians, while new Angle(Radians, 2 * PI, "Rotation", "R") would be a new angle unit based on radians. This fixes much of the hacky code surrounding the derived unit types Velocity, Per, and Mult, but is a breaking change for any user code that defines custom unit classes or uses the anonymous unit type.
This commit is contained in:
@@ -32,13 +32,14 @@ public class Per<N extends Unit<N>, D extends Unit<D>> extends Unit<Per<N, D>> {
|
||||
* Creates a new proportional unit derived from the ratio of one unit to another. Consider using
|
||||
* {@link #combine} instead of manually calling this constructor.
|
||||
*
|
||||
* @param baseType the base type representing the unit ratio
|
||||
* @param numerator the numerator unit
|
||||
* @param denominator the denominator unit
|
||||
*/
|
||||
protected Per(Class<Per<N, D>> baseType, N numerator, D denominator) {
|
||||
protected Per(N numerator, D denominator) {
|
||||
super(
|
||||
baseType,
|
||||
numerator.isBaseUnit() && denominator.isBaseUnit()
|
||||
? null
|
||||
: combine(numerator.getBaseUnit(), denominator.getBaseUnit()),
|
||||
numerator.toBaseUnits(1) / denominator.toBaseUnits(1),
|
||||
numerator.name() + " per " + denominator.name(),
|
||||
numerator.symbol() + "/" + denominator.symbol());
|
||||
@@ -46,6 +47,17 @@ public class Per<N extends Unit<N>, D extends Unit<D>> extends Unit<Per<N, D>> {
|
||||
m_denominator = denominator;
|
||||
}
|
||||
|
||||
Per(
|
||||
Per<N, D> baseUnit,
|
||||
UnaryFunction toBaseConverter,
|
||||
UnaryFunction fromBaseConverter,
|
||||
String name,
|
||||
String symbol) {
|
||||
super(baseUnit, toBaseConverter, fromBaseConverter, name, symbol);
|
||||
m_numerator = baseUnit.numerator();
|
||||
m_denominator = baseUnit.denominator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new Per unit derived from an arbitrary numerator and time denominator units. Using a
|
||||
* denominator with a unit of time is discouraged; use {@link Velocity} instead.
|
||||
@@ -63,7 +75,7 @@ public class Per<N extends Unit<N>, D extends Unit<D>> extends Unit<Per<N, D>> {
|
||||
* @param denominator the denominator for unit time
|
||||
* @return the combined unit
|
||||
*/
|
||||
@SuppressWarnings({"unchecked", "rawtypes"})
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <N extends Unit<N>, D extends Unit<D>> Per<N, D> combine(
|
||||
N numerator, D denominator) {
|
||||
final long key =
|
||||
@@ -74,7 +86,7 @@ public class Per<N extends Unit<N>, D extends Unit<D>> extends Unit<Per<N, D>> {
|
||||
return existing;
|
||||
}
|
||||
|
||||
var newUnit = new Per<N, D>((Class) Per.class, numerator, denominator);
|
||||
var newUnit = new Per<>(numerator, denominator);
|
||||
cache.put(key, newUnit);
|
||||
return newUnit;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user