Skip to content

Conversation

@bmccutchon
Copy link

I've added a hierarchy for Tuples in my fork. The hierarchy looks like this:

  • Tuple
    • Tupled
      • Tuple2d, Tuple3d, Tuple4d
    • Tuplef
      • Tuple2f, Tuple3f, Tuple4f
    • Tuplei
      • Tuple2i, Tuple3i, Tuple4i

Tupleb is missing from this because the Tuple*b classes don't currently have many of the methods that other Tuples do. The upper-level classes in this hierarchy declare useful abstract methods, so that it is possible to write code like this:

    // Average method for Tuples of type double
    @SafeVarargs
    public static <T extends Tupled<T>> T average(Tuple<T>... tuples) {
        T avg = sum(tuples);
        avg.scale(1.0 / ((double) tuples.length));
        return avg;
    }

    // Sum method for all Tuples (besides those of type byte)
    @SuppressWarnings("unchecked")
    @SafeVarargs
    public static <T extends Tuple<T>> T sum(Tuple<T>... tuples) {
        T sum = (T) tuples[0].clone();
        for (int i = 1; i < tuples.length; i++) {
            sum.add((T) tuples[i]);
        }
        return sum;
    }

This resolves #3.

The new hierarchy will look like this:

Tuple
 |- Tuplef (Tuple of type float)
 |   `- Tuple2f, Tuple3f, Tuple4f
 |- Tupled (Tuple of type double)
 |   `- Tuple2d, Tuple3d, Tuple4d
 `- Tuplei (Tuple of type int)
     `- Tuple2i, Tuple3i, Tuple4i

The tuples of type byte (Tuple3b, Tuple4b) will not participate in this
hierarchy since they do not currently implement any of its methods (add,
subtract, etc.), unless someone wishes to write these methods.
Make most of the TupleXX classes extend either Tupled, Tuplef, or
Tuplei. This includes the addition of methods where necessary and the
removal of several now-unnecessary clone methods (these are covered by
Tuple's clone method).
Add serialVersionUID to Tuple, Tuplef, Tuplei, and Tupled. Also remove
the "implements java.io.Serializable, Cloneable" declarations from the
subclasses of Tuple, as this commit makes them redundant.
Specify the abstract method equals(T) in type Tuple.
Documented Tuple, Tupled, Tuplef, Tuplei and their methods.
Add both interpolate methods to Tupled and Tuplef, as well as
epsilonEquals to Tupled. (For some reason, Tuplef subclasses don't have
epsilonEquals, and I didn't bother to add them.)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

One Tuple class to rule them all

1 participant