Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add hierarchy to Tuples #4

Open
wants to merge 7 commits into
base: master
Choose a base branch
from
Open

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