package cse1030; /** * A class that represents an integer value that is always between some * minimum and maximum value. A range has three properties: minimum, * maximum, and value. Range objects always ensure that the following class invariant * is true: * *

* minimum <= value <= maximum * *

* The mutator methods of the class are responsible for ensuring that the * above class invariant is always true. For example, if the minimum value of the * range is changed so that it is greater than the current value, then the * current value is also adjusted to maintain the class invariant. If the * minimum value is changed so that it is greater than the maximum value, * then both the maximum value and current value are also changed to maintain * the class invariant. * * @author CSE1030Z * */ public class Range { private int min; private int max; private int value; /** * Create a range with minimum value 0, maximum value 100, and initial value * 50. */ public Range() { this(0, 100, 50); } /** * Create a range with the specified minimum and maximum values. The initial * value is set to half way between the minimum and maximum values (rounded * down to the nearest integer if max - min is odd). * * @param min * the minimum value of the range * @param max * the maximum value of the range * @throws IllegalArgumentException * if min > max */ public Range(int min, int max) { this(min, max, (max + min) / 2); } /** * Create a range with the specified minimum, maximum, and initial values. * * @param min * the minimum value of the range * @param max * the maximum value of the range * @param init * the initial value of the range * @throws IllegalArgumentException * if the constraint min <= init <= max is not * satisfied */ public Range(int min, int max, int init) { if (min > max || min > init || max < init) { throw new IllegalArgumentException("invalid range properties"); } this.min = min; this.value = init; this.max = max; } /** * Returns the minimum value of the range * * @return the minimum value of the range */ public int getMinimum() { return this.min; } /** * Sets the minimum value of the range to newMinimum. The other * properties of the range may be changed to ensure that: * *

* minimum <= value <= maximum * * @param newMinimum * the new minimum of the range */ public void setMinimum(int newMinimum) { this.min = newMinimum; if (newMinimum > this.getMaximum()) { this.setMaximum(newMinimum); } if (newMinimum > this.getValue()) { this.setValue(newMinimum); } } /** * Returns the maximum value of the range * * @return the maximum value of the range */ public int getMaximum() { return this.max; } /** * Sets the maximum value of the range to newMaximum. The other * properties of the range may be changed to ensure that: * *

* minimum <= value <= maximum * * @param newMaximum * the new maximum of the range */ public void setMaximum(int newMaximum) { this.max = newMaximum; if (newMaximum < this.getMinimum()) { this.setMinimum(newMaximum); } if (newMaximum < this.getValue()) { this.setValue(newMaximum); } } /** * Return the current value of the range. * * @return the value of the range */ public int getValue() { return this.value; } /** * Set the current value of the range to newValue if * newValue satisfies the constraints of the range. Those * constraints are: * *

* minimum <= value <= maximum * *

* Otherwise, if newValue < minimum then the value is set to the * minimum value of the range, and if newValue > maximum then the * value is set to the maximum value of the range. * * @param value * the new value of the range */ public void setValue(int newValue) { if (this.getMinimum() <= newValue && newValue <= this.getMaximum()) { this.value = newValue; } else if (newValue < this.getMinimum()) { this.value = this.getMinimum(); } else { this.value = this.getMaximum(); } } }