001/** 002 * The MIT License (MIT) 003 * 004 * Copyright (c) 2015-2016 decimal4j (tools4j), Marco Terzer 005 * 006 * Permission is hereby granted, free of charge, to any person obtaining a copy 007 * of this software and associated documentation files (the "Software"), to deal 008 * in the Software without restriction, including without limitation the rights 009 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 010 * copies of the Software, and to permit persons to whom the Software is 011 * furnished to do so, subject to the following conditions: 012 * 013 * The above copyright notice and this permission notice shall be included in all 014 * copies or substantial portions of the Software. 015 * 016 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 018 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 019 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 020 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 021 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 022 * SOFTWARE. 023 */ 024package org.decimal4j.api; 025 026import java.math.RoundingMode; 027 028import org.decimal4j.scale.ScaleMetrics; 029import org.decimal4j.truncate.OverflowMode; 030import org.decimal4j.truncate.TruncationPolicy; 031 032/** 033 * Interface implemented by immutable {@link Decimal} classes of different 034 * scales. Immutable Decimals allocate a new Decimals instance for results of 035 * arithmetic operations. 036 * <p> 037 * Consider also {@link MutableDecimal} descendants especially for chained 038 * operations. 039 * <p> 040 * Immutable Decimals are thread safe. 041 * 042 * @param <S> 043 * the scale metrics type associated with this Decimal 044 */ 045public interface ImmutableDecimal<S extends ScaleMetrics> extends Decimal<S> { 046 047 /** 048 * Returns the minimum of this {@code Decimal} and {@code val}. 049 * 050 * @param val 051 * value with which the minimum is to be computed. 052 * @return the {@code Decimal} whose value is the lesser of this 053 * {@code Decimal} and {@code val}. If they are equal, as defined by 054 * the {@link #compareTo(Decimal) compareTo} method, {@code this} is 055 * returned. 056 * @see #compareTo(Decimal) 057 */ 058 ImmutableDecimal<S> min(ImmutableDecimal<S> val); 059 060 /** 061 * Returns the maximum of this {@code Decimal} and {@code val}. 062 * 063 * @param val 064 * value with which the maximum is to be computed. 065 * @return the {@code Decimal} whose value is the greater of this 066 * {@code Decimal} and {@code val}. If they are equal, as defined by 067 * the {@link #compareTo(Decimal) compareTo} method, {@code this} is 068 * returned. 069 * @see #compareTo(Decimal) 070 */ 071 ImmutableDecimal<S> max(ImmutableDecimal<S> val); 072 073 //override some methods with specialized return type 074 075 @Override 076 ImmutableDecimal<S> integralPart(); 077 078 @Override 079 ImmutableDecimal<S> fractionalPart(); 080 081 @Override 082 ImmutableDecimal<S> round(int precision); 083 084 @Override 085 ImmutableDecimal<S> round(int precision, RoundingMode roundingMode); 086 087 @Override 088 ImmutableDecimal<S> round(int precision, TruncationPolicy truncationPolicy); 089 090 @Override 091 ImmutableDecimal<?> scale(int scale); 092 093 @SuppressWarnings("hiding") 094 @Override 095 <S extends ScaleMetrics> ImmutableDecimal<S> scale(S scaleMetrics); 096 097 @Override 098 ImmutableDecimal<?> scale(int scale, RoundingMode roundingMode); 099 100 @SuppressWarnings("hiding") 101 @Override 102 <S extends ScaleMetrics> ImmutableDecimal<S> scale(S scaleMetrics, RoundingMode roundingMode); 103 104 @Override 105 ImmutableDecimal<S> add(Decimal<S> augend); 106 107 @Override 108 ImmutableDecimal<S> add(Decimal<S> augend, OverflowMode overflowMode); 109 110 @Override 111 ImmutableDecimal<S> add(Decimal<?> augend, RoundingMode roundingMode); 112 113 @Override 114 ImmutableDecimal<S> add(Decimal<?> augend, TruncationPolicy truncationPolicy); 115 116 @Override 117 ImmutableDecimal<S> add(long augend); 118 119 @Override 120 ImmutableDecimal<S> add(long augend, OverflowMode overflowMode); 121 122 @Override 123 ImmutableDecimal<S> add(double augend); 124 125 @Override 126 ImmutableDecimal<S> add(double augend, RoundingMode roundingMode); 127 128 @Override 129 ImmutableDecimal<S> addUnscaled(long unscaledAugend); 130 131 @Override 132 ImmutableDecimal<S> addUnscaled(long unscaledAugend, OverflowMode overflowMode); 133 134 @Override 135 ImmutableDecimal<S> addUnscaled(long unscaledAugend, int scale); 136 137 @Override 138 ImmutableDecimal<S> addUnscaled(long unscaledAugend, int scale, RoundingMode roundingMode); 139 140 @Override 141 ImmutableDecimal<S> addUnscaled(long unscaledAugend, int scale, TruncationPolicy truncationPolicy); 142 143 @Override 144 ImmutableDecimal<S> addSquared(Decimal<S> value); 145 146 @Override 147 ImmutableDecimal<S> addSquared(Decimal<S> value, RoundingMode roundingMode); 148 149 @Override 150 ImmutableDecimal<S> addSquared(Decimal<S> value, TruncationPolicy truncationPolicy); 151 152 @Override 153 ImmutableDecimal<S> subtract(Decimal<S> subtrahend); 154 155 @Override 156 ImmutableDecimal<S> subtract(Decimal<S> subtrahend, OverflowMode overflowMode); 157 158 @Override 159 ImmutableDecimal<S> subtract(Decimal<?> subtrahend, RoundingMode roundingMode); 160 161 @Override 162 ImmutableDecimal<S> subtract(Decimal<?> subtrahend, TruncationPolicy truncationPolicy); 163 164 @Override 165 ImmutableDecimal<S> subtract(long subtrahend); 166 167 @Override 168 ImmutableDecimal<S> subtract(long subtrahend, OverflowMode overflowMode); 169 170 @Override 171 ImmutableDecimal<S> subtract(double subtrahend); 172 173 @Override 174 ImmutableDecimal<S> subtract(double subtrahend, RoundingMode roundingMode); 175 176 @Override 177 ImmutableDecimal<S> subtractUnscaled(long unscaledSubtrahend); 178 179 @Override 180 ImmutableDecimal<S> subtractUnscaled(long unscaledSubtrahend, OverflowMode overflowMode); 181 182 @Override 183 ImmutableDecimal<S> subtractUnscaled(long unscaledSubtrahend, int scale); 184 185 @Override 186 ImmutableDecimal<S> subtractUnscaled(long unscaledSubtrahend, int scale, RoundingMode roundingMode); 187 188 @Override 189 ImmutableDecimal<S> subtractUnscaled(long unscaledSubtrahend, int scale, TruncationPolicy truncationPolicy); 190 191 @Override 192 ImmutableDecimal<S> subtractSquared(Decimal<S> value); 193 194 @Override 195 ImmutableDecimal<S> subtractSquared(Decimal<S> value, RoundingMode roundingMode); 196 197 @Override 198 ImmutableDecimal<S> subtractSquared(Decimal<S> value, TruncationPolicy truncationPolicy); 199 200 @Override 201 ImmutableDecimal<S> multiply(Decimal<S> multiplicand); 202 203 @Override 204 ImmutableDecimal<S> multiply(Decimal<S> multiplicand, RoundingMode roundingMode); 205 206 @Override 207 ImmutableDecimal<S> multiply(Decimal<S> multiplicand, TruncationPolicy truncationPolicy); 208 209 @Override 210 ImmutableDecimal<S> multiplyBy(Decimal<?> multiplicand); 211 212 @Override 213 ImmutableDecimal<S> multiplyBy(Decimal<?> multiplicand, RoundingMode roundingMode); 214 215 @Override 216 ImmutableDecimal<S> multiplyBy(Decimal<?> multiplicand, TruncationPolicy truncationPolicy); 217 218 @Override 219 ImmutableDecimal<?> multiplyExact(Decimal<?> multiplicand); 220 221 @Override 222 ImmutableDecimal<S> multiply(long multiplicand); 223 224 @Override 225 ImmutableDecimal<S> multiply(long multiplicand, OverflowMode overflowMode); 226 227 @Override 228 ImmutableDecimal<S> multiply(double multiplicand); 229 230 @Override 231 ImmutableDecimal<S> multiply(double multiplicand, RoundingMode roundingMode); 232 233 @Override 234 ImmutableDecimal<S> multiplyUnscaled(long unscaledMultiplicand); 235 236 @Override 237 ImmutableDecimal<S> multiplyUnscaled(long unscaledMultiplicand, RoundingMode roundingMode); 238 239 @Override 240 ImmutableDecimal<S> multiplyUnscaled(long unscaledMultiplicand, TruncationPolicy truncationPolicy); 241 242 @Override 243 ImmutableDecimal<S> multiplyUnscaled(long unscaledMultiplicand, int scale); 244 245 @Override 246 ImmutableDecimal<S> multiplyUnscaled(long unscaledMultiplicand, int scale, RoundingMode roundingMode); 247 248 @Override 249 ImmutableDecimal<S> multiplyUnscaled(long unscaledMultiplicand, int scale, TruncationPolicy truncationPolicy); 250 251 @Override 252 ImmutableDecimal<S> multiplyByPowerOfTen(int n); 253 254 @Override 255 ImmutableDecimal<S> multiplyByPowerOfTen(int n, RoundingMode roundingMode); 256 257 @Override 258 ImmutableDecimal<S> multiplyByPowerOfTen(int n, TruncationPolicy truncationPolicy); 259 260 @Override 261 ImmutableDecimal<S> divide(Decimal<S> divisor); 262 263 @Override 264 ImmutableDecimal<S> divide(Decimal<S> divisor, RoundingMode roundingMode); 265 266 @Override 267 ImmutableDecimal<S> divide(Decimal<S> divisor, TruncationPolicy truncationPolicy); 268 269 @Override 270 ImmutableDecimal<S> divideBy(Decimal<?> divisor); 271 272 @Override 273 ImmutableDecimal<S> divideBy(Decimal<?> divisor, RoundingMode roundingMode); 274 275 @Override 276 ImmutableDecimal<S> divideBy(Decimal<?> divisor, TruncationPolicy truncationPolicy); 277 278 @Override 279 ImmutableDecimal<S> divideTruncate(Decimal<S> divisor); 280 281 @Override 282 ImmutableDecimal<S> divideExact(Decimal<S> divisor); 283 284 @Override 285 ImmutableDecimal<S> divide(long divisor); 286 287 @Override 288 ImmutableDecimal<S> divide(long divisor, RoundingMode roundingMode); 289 290 @Override 291 ImmutableDecimal<S> divide(long divisor, TruncationPolicy truncationPolicy); 292 293 @Override 294 ImmutableDecimal<S> divide(double divisor); 295 296 @Override 297 ImmutableDecimal<S> divide(double divisor, RoundingMode roundingMode); 298 299 @Override 300 ImmutableDecimal<S> divideUnscaled(long unscaledDivisor); 301 302 @Override 303 ImmutableDecimal<S> divideUnscaled(long unscaledDivisor, RoundingMode roundingMode); 304 305 @Override 306 ImmutableDecimal<S> divideUnscaled(long unscaledDivisor, TruncationPolicy truncationPolicy); 307 308 @Override 309 ImmutableDecimal<S> divideUnscaled(long unscaledDivisor, int scale); 310 311 @Override 312 ImmutableDecimal<S> divideUnscaled(long unscaledDivisor, int scale, RoundingMode roundingMode); 313 314 @Override 315 ImmutableDecimal<S> divideUnscaled(long unscaledDivisor, int scale, TruncationPolicy truncationPolicy); 316 317 @Override 318 ImmutableDecimal<S> divideByPowerOfTen(int n); 319 320 @Override 321 ImmutableDecimal<S> divideByPowerOfTen(int n, RoundingMode roundingMode); 322 323 @Override 324 ImmutableDecimal<S> divideByPowerOfTen(int n, TruncationPolicy truncationPolicy); 325 326 @Override 327 ImmutableDecimal<S> divideToIntegralValue(Decimal<S> divisor); 328 329 @Override 330 ImmutableDecimal<S> divideToIntegralValue(Decimal<S> divisor, OverflowMode overflowMode); 331 332 @Override 333 ImmutableDecimal<S>[] divideAndRemainder(Decimal<S> divisor); 334 335 @Override 336 ImmutableDecimal<S>[] divideAndRemainder(Decimal<S> divisor, OverflowMode overflowMode); 337 338 @Override 339 ImmutableDecimal<S> remainder(Decimal<S> divisor); 340 341 @Override 342 ImmutableDecimal<S> negate(); 343 344 @Override 345 ImmutableDecimal<S> negate(OverflowMode overflowMode); 346 347 @Override 348 ImmutableDecimal<S> abs(); 349 350 @Override 351 ImmutableDecimal<S> abs(OverflowMode overflowMode); 352 353 @Override 354 ImmutableDecimal<S> invert(); 355 356 @Override 357 ImmutableDecimal<S> invert(RoundingMode roundingMode); 358 359 @Override 360 ImmutableDecimal<S> invert(TruncationPolicy truncationPolicy); 361 362 @Override 363 ImmutableDecimal<S> square(); 364 365 @Override 366 ImmutableDecimal<S> square(RoundingMode roundingMode); 367 368 @Override 369 ImmutableDecimal<S> square(TruncationPolicy truncationPolicy); 370 371 @Override 372 ImmutableDecimal<S> sqrt(); 373 374 @Override 375 ImmutableDecimal<S> sqrt(RoundingMode roundingMode); 376 377 @Override 378 ImmutableDecimal<S> shiftLeft(int n); 379 380 @Override 381 ImmutableDecimal<S> shiftLeft(int n, RoundingMode roundingMode); 382 383 @Override 384 ImmutableDecimal<S> shiftLeft(int n, TruncationPolicy truncationPolicy); 385 386 @Override 387 ImmutableDecimal<S> shiftRight(int n); 388 389 @Override 390 ImmutableDecimal<S> shiftRight(int n, RoundingMode roundingMode); 391 392 @Override 393 ImmutableDecimal<S> shiftRight(int n, TruncationPolicy truncationPolicy); 394 395 @Override 396 ImmutableDecimal<S> pow(int n); 397 398 @Override 399 ImmutableDecimal<S> pow(int n, RoundingMode roundingMode); 400 401 @Override 402 ImmutableDecimal<S> pow(int n, TruncationPolicy truncationPolicy); 403 404 @Override 405 ImmutableDecimal<S> avg(Decimal<S> val); 406 407 @Override 408 ImmutableDecimal<S> avg(Decimal<S> val, RoundingMode roundingMode); 409}