src/main/java/eu/digitisation/math/BiCounter.java
public int value(T1 o1, T2 o2) {
        if (o1 == null) {
            return subtotal2.value(o2);
        } else if (o2 == null) {
            return subtotal1.value(o1);
        } else {
            Pair<T1, T2> pair = new Pair<T1, T2>(o1, o2);
            return super.value(pair);
        }
    }
/**
     *
     * @param o1 first component in pair
     * @param o2 second component in pair
     * @return the value of the counter for that pair, or 0 if not stored. If
     * one the components is null the marginal count is returned.
     * @throws NullPointerException if both objects are null
     */
@param o1 first component in pair
@param o2 second component in pair
@return the value of the counter for that pair, or 0 if not stored. If
one the components is null the marginal count is returned.
@throws NullPointerException if both objects are null
@param o1 first component in pair @param o2 second component in pair @return the value of the counter for that pair or 0 if not stored . If one the components is null the marginal count is returned . @throws NullPointerException if both objects are null
public int value(T1 o1, T2 o2) {
        if (o1 == null) {
            return subtotal2.value(o2);
        } else if (o2 == null) {
            return subtotal1.value(o1);
        } else {
            Pair<T1, T2> pair = new Pair<T1, T2>(o1, o2);
            return super.value(pair);
        }
    }
public int value ( T1 o1 , T2 o2 ) { if ( o1 == null ) { return subtotal2 . value ( o2 ) ; } else if ( o2 == null ) { return subtotal1 . value ( o1 ) ; } else { Pair < T1 , T2 > pair = new Pair < T1 , T2 > ( o1 , o2 ) ; return super . value ( pair ) ; } }
@param o1 first component in pair
 @param o2 second component in pair
 @return the value of the counter for that pair, or 0 if not stored.
@param o1 first component in pair @param o2 second component in pair @return the value of the counter for that pair or 0 if not stored .