001 package data;
002
003 import java.io.Serializable;
004
005 /**
006 * An objectified value.
007 *
008 * <p>Values are objects that understand the four basic operations <code>add</code>, <code>subtract</code>,
009 * <code>multiply</code> and <code>divide</code>. Additionally, they have an operation for multiplication with
010 * 'scalars', i.e. simple type numeric values. Values are commutative monoids with respect to addition and
011 * multiplication.</p>
012 *
013 * <p>An ordering relation is defined on the values, but it is up to the concrete type of value, whether this
014 * ordering is a half ordering relation.</p>
015 *
016 * @author Steffen Zschaler
017 * @version 2.0 19/08/1999
018 * @since v2.0
019 */
020 public interface Value extends Cloneable, Comparable, Serializable {
021
022 /**
023 * Add the given value to this one, changing this value.
024 *
025 * @override Always
026 *
027 * @param v the value to be added.
028 */
029 public void addAccumulating(Value v);
030
031 /**
032 * Subtract the given value from this one, changing this value.
033 *
034 * @override Always
035 *
036 * @param v the value to be subtracted.
037 */
038 public void subtractAccumulating(Value v);
039
040 /**
041 * Multiply the given value by this one, changing this value.
042 *
043 * @override Always
044 *
045 * @param v the value to be multplied by.
046 */
047 public void multiplyAccumulating(Value v);
048
049 /**
050 * Multiply this value by the given 'scalar', changing this value.
051 *
052 * @override Always
053 *
054 * @param dl the value by which to multiply.
055 */
056 public void multiplyAccumulating(double dl);
057
058 /**
059 * Multiply this value by the given 'scalar', changing this value.
060 *
061 * @override Always
062 *
063 * @param fl the value by which to multiply.
064 */
065 public void multiplyAccumulating(float fl);
066
067 /**
068 * Multiply this value by the given 'scalar', changing this value.
069 *
070 * @override Always
071 *
072 * @param l the value by which to multiply.
073 */
074 public void multiplyAccumulating(long l);
075
076 /**
077 * Multiply this value by the given 'scalar', changing this value.
078 *
079 * @override Always
080 *
081 * @param n the value by which to multiply.
082 */
083 public void multiplyAccumulating(int n);
084
085 /**
086 * Divide this value by the given one, changing this value.
087 *
088 * @override Always
089 *
090 * @param v the value by which to divide.
091 */
092 public void divideAccumulating(Value v);
093
094 /**
095 * Add the given value to this one, and return the result.
096 *
097 * @override Always
098 *
099 * @param v the value to be added.
100 */
101 public Value add(Value v);
102
103 /**
104 * Subtract the given value from this one, and return the result.
105 *
106 * @override Always
107 *
108 * @param v the value to be subtracted.
109 */
110 public Value subtract(Value v);
111
112 /**
113 * Multiply this value by the given one, and return the result.
114 *
115 * @override Always
116 *
117 * @param v the value by which to multiply.
118 */
119 public Value multiply(Value v);
120
121 /**
122 * Multiply this value by the given 'scalar', and return the result.
123 *
124 * @override Always
125 *
126 * @param dl the 'scalar' by which to multiply.
127 */
128 public Value multiply(double dl);
129
130 /**
131 * Multiply this value by the given 'scalar', and return the result.
132 *
133 * @override Always
134 *
135 * @param fl the 'scalar' by which to multiply.
136 */
137 public Value multiply(float fl);
138
139 /**
140 * Multiply this value by the given 'scalar', and return the result.
141 *
142 * @override Always
143 *
144 * @param l the 'scalar' by which to multiply.
145 */
146 public Value multiply(long l);
147
148 /**
149 * Multiply this value by the given 'scalar', and return the result.
150 *
151 * @override Always
152 *
153 * @param n the 'scalar' by which to multiply.
154 */
155 public Value multiply(int n);
156
157 /**
158 * Divide this value by the given one, and return the result.
159 *
160 * @override Always
161 *
162 * @param v the value by which to divide.
163 */
164 public Value divide(Value v);
165
166 /**
167 * Check whether this is the zero element with respect to addition.
168 *
169 * @override Always
170 *
171 * @return true if this is the zero element with respect to addition, i.e. if for any value <code>v</code>:
172 * <code>(v.getClass() == this.getClass()) -> ((v.add (this).equals (v)) && (this.add (v).equals (v)))</code>.
173 */
174 public boolean isAddZero();
175
176 /**
177 * Check whether this is the zero element with respect to multiplication.
178 *
179 * @override Always
180 *
181 * @return true if this is the zero element with respect to multiplication, i.e. if for any value <code>v</code>:
182 * <code>(v.getClass() == this.getClass()) -> ((v.multiply (this).equals (this)) && (this.multiply (v).equals (this)))</code>.
183 */
184 public boolean isMulZero();
185
186 /**
187 * Check whether this is the one element with respect to multiplication.
188 *
189 * @override Always
190 *
191 * @return true if this is the one element with respect to multiplication, i.e. if for any value <code>v</code>:
192 * <code>(v.getClass() == this.getClass()) -> ((v.multiply (this).equals (v)) && (this.multiply (v).equals (v)))</code>.
193 */
194 public boolean isMulOne();
195
196 /**
197 * Clone this value.
198 *
199 * @override Always
200 */
201 public Object clone();
202 }