summaryrefslogtreecommitdiff
path: root/src/org/unitConverter/UnitsDatabase.java
diff options
context:
space:
mode:
authorAdrien Hopkins <adrien.p.hopkins@gmail.com>2019-04-14 17:45:16 -0400
committerAdrien Hopkins <adrien.p.hopkins@gmail.com>2019-04-14 17:45:16 -0400
commit2ce65fa76908d77a5e3b045a8eb40c798939b8be (patch)
tree231fcb8f72a467a77efc1e6050de12bd70f7b152 /src/org/unitConverter/UnitsDatabase.java
parentd7a587694d857fa468c7aae6a5f4fda24f3577fa (diff)
parentb43c399c21bddd3cb8af42c109940564c3890cf7 (diff)
Merge branch 'release-0.2.0' into develop
Diffstat (limited to 'src/org/unitConverter/UnitsDatabase.java')
-rwxr-xr-xsrc/org/unitConverter/UnitsDatabase.java47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/org/unitConverter/UnitsDatabase.java b/src/org/unitConverter/UnitsDatabase.java
index abe6546..e5d2f67 100755
--- a/src/org/unitConverter/UnitsDatabase.java
+++ b/src/org/unitConverter/UnitsDatabase.java
@@ -72,9 +72,15 @@ public final class UnitsDatabase {
* "A", inputting "ABC" will return the unit "C" with the prefix "AB", not "BC" with the prefix "A".</li>
* </ul>
* </p>
+ * <p>
+ * This map is infinite in size if there is at least one unit and at least one prefix. If it is infinite, some
+ * operations that only work with finite collections, like converting name/entry sets to arrays, will throw an
+ * {@code UnsupportedOperationException}.
+ * </p>
*
* @author Adrien Hopkins
* @since 2019-04-13
+ * @since v0.2.0
*/
private static final class PrefixedUnitMap implements Map<String, Unit> {
/**
@@ -82,6 +88,7 @@ public final class UnitsDatabase {
*
* @author Adrien Hopkins
* @since 2019-04-13
+ * @since v0.2.0
*/
private static final class PrefixedUnitEntrySet extends AbstractSet<Map.Entry<String, Unit>> {
/**
@@ -89,6 +96,7 @@ public final class UnitsDatabase {
*
* @author Adrien Hopkins
* @since 2019-04-14
+ * @since v0.2.0
*/
private static final class PrefixedUnitEntry implements Entry<String, Unit> {
private final String key;
@@ -98,8 +106,11 @@ public final class UnitsDatabase {
* Creates the {@code PrefixedUnitEntry}.
*
* @param key
+ * key
* @param value
+ * value
* @since 2019-04-14
+ * @since v0.2.0
*/
public PrefixedUnitEntry(final String key, final Unit value) {
this.key = key;
@@ -127,6 +138,7 @@ public final class UnitsDatabase {
*
* @author Adrien Hopkins
* @since 2019-04-14
+ * @since v0.2.0
*/
private static final class PrefixedUnitEntryIterator implements Iterator<Entry<String, Unit>> {
// position in the unit list
@@ -143,6 +155,7 @@ public final class UnitsDatabase {
* Creates the {@code UnitsDatabase.PrefixedUnitMap.PrefixedUnitNameSet.PrefixedUnitNameIterator}.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
public PrefixedUnitEntryIterator(final PrefixedUnitEntrySet set) {
this.map = set.map;
@@ -153,6 +166,7 @@ public final class UnitsDatabase {
/**
* @return current unit name
* @since 2019-04-14
+ * @since v0.2.0
*/
private String getCurrentUnitName() {
final StringBuilder unitName = new StringBuilder();
@@ -180,6 +194,7 @@ public final class UnitsDatabase {
* Changes this iterator's position to the next available one.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
private void incrementPosition() {
this.unitNamePosition++;
@@ -239,7 +254,9 @@ public final class UnitsDatabase {
* Creates the {@code PrefixedUnitNameSet}.
*
* @param map
+ * map that created this set
* @since 2019-04-13
+ * @since v0.2.0
*/
public PrefixedUnitEntrySet(final PrefixedUnitMap map) {
this.map = map;
@@ -353,6 +370,7 @@ public final class UnitsDatabase {
*
* @author Adrien Hopkins
* @since 2019-04-13
+ * @since v0.2.0
*/
private static final class PrefixedUnitNameSet extends AbstractSet<String> {
/**
@@ -360,6 +378,7 @@ public final class UnitsDatabase {
*
* @author Adrien Hopkins
* @since 2019-04-14
+ * @since v0.2.0
*/
private static final class PrefixedUnitNameIterator implements Iterator<String> {
// position in the unit list
@@ -376,6 +395,7 @@ public final class UnitsDatabase {
* Creates the {@code UnitsDatabase.PrefixedUnitMap.PrefixedUnitNameSet.PrefixedUnitNameIterator}.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
public PrefixedUnitNameIterator(final PrefixedUnitNameSet set) {
this.map = set.map;
@@ -386,6 +406,7 @@ public final class UnitsDatabase {
/**
* @return current unit name
* @since 2019-04-14
+ * @since v0.2.0
*/
private String getCurrentUnitName() {
final StringBuilder unitName = new StringBuilder();
@@ -413,6 +434,7 @@ public final class UnitsDatabase {
* Changes this iterator's position to the next available one.
*
* @since 2019-04-14
+ * @since v0.2.0
*/
private void incrementPosition() {
this.unitNamePosition++;
@@ -472,7 +494,9 @@ public final class UnitsDatabase {
* Creates the {@code PrefixedUnitNameSet}.
*
* @param map
+ * map that created this set
* @since 2019-04-13
+ * @since v0.2.0
*/
public PrefixedUnitNameSet(final PrefixedUnitMap map) {
this.map = map;
@@ -567,13 +591,13 @@ public final class UnitsDatabase {
// infinite set
throw new UnsupportedOperationException("Cannot make an infinite set into an array.");
}
-
}
/**
* The units stored in this collection, without prefixes.
*
* @since 2019-04-13
+ * @since v0.2.0
*/
private final Map<String, Unit> units;
@@ -581,6 +605,7 @@ public final class UnitsDatabase {
* The available prefixes for use.
*
* @since 2019-04-13
+ * @since v0.2.0
*/
private final Map<String, UnitPrefix> prefixes;
@@ -593,8 +618,11 @@ public final class UnitsDatabase {
* Creates the {@code PrefixedUnitMap}.
*
* @param units
+ * map mapping unit names to units
* @param prefixes
+ * map mapping prefix names to prefixes
* @since 2019-04-13
+ * @since v0.2.0
*/
public PrefixedUnitMap(final Map<String, Unit> units, final Map<String, UnitPrefix> prefixes) {
// I am making unmodifiable maps to ensure I don't accidentally make changes.
@@ -804,6 +832,7 @@ public final class UnitsDatabase {
* exponent
* @return result
* @since 2019-04-10
+ * @since v0.2.0
*/
private static final LinearUnit exponentiateUnits(final LinearUnit base, final LinearUnit exponentUnit) {
// exponent function - first check if o2 is a number,
@@ -841,6 +870,7 @@ public final class UnitsDatabase {
* The dimensions in this system.
*
* @since 2019-03-14
+ * @since v0.2.0
*/
private final Map<String, UnitDimension> dimensions;
@@ -848,6 +878,7 @@ public final class UnitsDatabase {
* A map mapping strings to units (including prefixes)
*
* @since 2019-04-13
+ * @since v0.2.0
*/
private final Map<String, Unit> units;
@@ -855,6 +886,7 @@ public final class UnitsDatabase {
* A parser that can parse unit expressions.
*
* @since 2019-03-22
+ * @since v0.2.0
*/
private final ExpressionParser<LinearUnit> unitExpressionParser = new ExpressionParser.Builder<>(
this::getLinearUnit).addBinaryOperator("+", (o1, o2) -> o1.plus(o2), 0)
@@ -867,6 +899,7 @@ public final class UnitsDatabase {
* A parser that can parse unit prefix expressions
*
* @since 2019-04-13
+ * @since v0.2.0
*/
private final ExpressionParser<UnitPrefix> prefixExpressionParser = new ExpressionParser.Builder<>(this::getPrefix)
.addBinaryOperator("*", (o1, o2) -> o1.times(o2), 0).addSpaceFunction("*")
@@ -877,6 +910,7 @@ public final class UnitsDatabase {
* A parser that can parse unit dimension expressions.
*
* @since 2019-04-13
+ * @since v0.2.0
*/
private final ExpressionParser<UnitDimension> unitDimensionParser = new ExpressionParser.Builder<>(
this::getDimension).addBinaryOperator("*", (o1, o2) -> o1.times(o2), 0).addSpaceFunction("*")
@@ -905,6 +939,7 @@ public final class UnitsDatabase {
* @throws NullPointerException
* if name or dimension is null
* @since 2019-03-14
+ * @since v0.2.0
*/
public void addDimension(final String name, final UnitDimension dimension) {
this.dimensions.put(Objects.requireNonNull(name, "name must not be null."),
@@ -919,6 +954,7 @@ public final class UnitsDatabase {
* @param lineCounter
* number of line, for error messages
* @since 2019-04-10
+ * @since v0.2.0
*/
private void addDimensionFromLine(final String line, final long lineCounter) {
// ignore lines that start with a # sign - they're comments
@@ -1004,6 +1040,7 @@ public final class UnitsDatabase {
* @param lineCounter
* number of line, for error messages
* @since 2019-04-10
+ * @since v0.2.0
*/
private void addUnitOrPrefixFromLine(final String line, final long lineCounter) {
// ignore lines that start with a # sign - they're comments
@@ -1064,6 +1101,7 @@ public final class UnitsDatabase {
* name to test
* @return if database contains name
* @since 2019-03-14
+ * @since v0.2.0
*/
public boolean containsDimensionName(final String name) {
return this.dimensions.containsKey(name);
@@ -1098,6 +1136,7 @@ public final class UnitsDatabase {
/**
* @return a map mapping dimension names to dimensions
* @since 2019-04-13
+ * @since v0.2.0
*/
public Map<String, UnitDimension> dimensionMap() {
return Collections.unmodifiableMap(this.dimensions);
@@ -1114,6 +1153,7 @@ public final class UnitsDatabase {
* dimension's name
* @return dimension
* @since 2019-03-14
+ * @since v0.2.0
*/
public UnitDimension getDimension(final String name) {
Objects.requireNonNull(name, "name must not be null.");
@@ -1152,6 +1192,7 @@ public final class UnitsDatabase {
* @throws NullPointerException
* if expression is null
* @since 2019-04-13
+ * @since v0.2.0
*/
public UnitDimension getDimensionFromExpression(final String expression) {
Objects.requireNonNull(expression, "expression must not be null.");
@@ -1180,6 +1221,7 @@ public final class UnitsDatabase {
* unit's name
* @return unit
* @since 2019-03-22
+ * @since v0.2.0
*/
private LinearUnit getLinearUnit(final String name) {
// see if I am using a function-unit like tempC(100)
@@ -1411,6 +1453,7 @@ public final class UnitsDatabase {
/**
* @return a map mapping prefix names to prefixes
* @since 2019-04-13
+ * @since v0.2.0
*/
public Map<String, UnitPrefix> prefixMap() {
return Collections.unmodifiableMap(this.prefixes);
@@ -1419,6 +1462,7 @@ public final class UnitsDatabase {
/**
* @return a map mapping unit names to units, including prefixed names
* @since 2019-04-13
+ * @since v0.2.0
*/
public Map<String, Unit> unitMap() {
return this.units; // PrefixedUnitMap is immutable so I don't need to make an unmodifiable map.
@@ -1427,6 +1471,7 @@ public final class UnitsDatabase {
/**
* @return a map mapping unit names to units, ignoring prefixes
* @since 2019-04-13
+ * @since v0.2.0
*/
public Map<String, Unit> unitMapPrefixless() {
return Collections.unmodifiableMap(this.prefixlessUnits);