jtulach@325: package org.apidesign.sidemeanings.math;
jtulach@325:
jtulach@325: /** Rewrite of original
jtulach@325: *
jtulach@325: * Arithmetica
jtulach@325: * class from the composition project
jtulach@325: * to follow the eliminate fuzzy modifiers
rule.
jtulach@325: *
jtulach@325: * @author Jaroslav Tulach
jtulach@325: * @version 5.0
jtulach@325: */
jtulach@325: // BEGIN: design.sidemeanings.arith
jtulach@325: public abstract class Arithmetica {
jtulach@325: // BEGIN: design.sidemeanings.arith.sumTwo
jtulach@325: public final int sumTwo(int one, int second) {
jtulach@325: return overridableSumTwo(one, second);
jtulach@325: }
jtulach@325: protected abstract int overridableSumTwo(int one, int second);
jtulach@325: protected final int defaultSumTwo(int one, int second) {
jtulach@325: return one + second;
jtulach@325: }
jtulach@325: // END: design.sidemeanings.arith.sumTwo
jtulach@325:
jtulach@325: public final int sumAll(int... numbers) {
jtulach@325: return overridableSumAll(numbers);
jtulach@325: }
jtulach@325: protected abstract int overridableSumAll(int... numbers);
jtulach@325: protected final int defaultSumAll(int... numbers) {
jtulach@325: if (numbers.length == 0) {
jtulach@325: return 0;
jtulach@325: }
jtulach@325: int sum = numbers[0];
jtulach@325: for (int i = 1; i < numbers.length; i++) {
jtulach@376: // do I want to call sumTwo or defaultSumTwo?
jtulach@376: // That is a question!
jtulach@325: sum = openUpToSubclasses() ?
jtulach@325: sumTwo(sum, numbers[i]) :
jtulach@325: defaultSumTwo(sum, numbers[i]);
jtulach@325: }
jtulach@325: return sum;
jtulach@325: }
jtulach@325:
jtulach@325: public final int sumRange(int from, int to) {
jtulach@325: return overridableSumRange(from, to);
jtulach@325: }
jtulach@325: protected abstract int overridableSumRange(int from, int to);
jtulach@325: protected final int defaultSumRange(int from, int to) {
jtulach@325: int len = to - from;
jtulach@325: if (len < 0) {
jtulach@325: len = -len;
jtulach@325: from = to;
jtulach@325: }
jtulach@325: int[] array = new int[len + 1];
jtulach@325: for (int i = 0; i <= len; i++) {
jtulach@325: array[i] = from + i;
jtulach@325: }
jtulach@325: // BEGIN: design.sidemeanings.arith.the.question
jtulach@325: // Again, an API author has to ask what sumAll one wants to call?
jtulach@325: // Am I about to open up to subclasses or do I want default impl?
jtulach@325: return openUpToSubclasses() ?
jtulach@325: sumAll(array) :
jtulach@325: defaultSumAll(array);
jtulach@325: // END: design.sidemeanings.arith.the.question
jtulach@325: }
jtulach@325:
jtulach@325: boolean openUpToSubclasses = true;
jtulach@325: boolean openUpToSubclasses() {
jtulach@325: return openUpToSubclasses;
jtulach@325: }
jtulach@325:
jtulach@325:
jtulach@325: // BEGIN: design.sidemeanings.arith.factory
jtulach@325: public static Arithmetica create() {
jtulach@325: return new Arithmetica.Impl();
jtulach@325: }
jtulach@325: private static class Impl extends Arithmetica {
jtulach@325: @Override
jtulach@325: protected int overridableSumTwo(int one, int second) {
jtulach@325: return defaultSumTwo(one, second);
jtulach@325: }
jtulach@325:
jtulach@325: @Override
jtulach@325: protected int overridableSumAll(int... numbers) {
jtulach@325: return defaultSumAll(numbers);
jtulach@325: }
jtulach@325:
jtulach@325: @Override
jtulach@325: protected int overridableSumRange(int from, int to) {
jtulach@325: return defaultSumRange(from, to);
jtulach@325: }
jtulach@325: }
jtulach@325: // END: design.sidemeanings.arith.factory
jtulach@325:
jtulach@325: }
jtulach@325: // END: design.sidemeanings.arith