/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.dstream.utils; import java.io.Serializable; import java.util.ArrayList; import java.util.List; /** * Definition of Tuple structures. */ public interface Tuples { /** * */ public static class Tuple implements Serializable, Comparable<Object>, Tuple2<Object, Object>, Tuple3<Object, Object, Object>, Tuple4<Object, Object, Object, Object>, Tuple5<Object, Object, Object, Object, Object>, Tuple6<Object, Object, Object, Object, Object, Object> { private static final long serialVersionUID = 3141806564307095593L; private final List<Object> values; public Tuple(Object... values){ this.values = new ArrayList<>(values.length); this.add(values); } private Tuple(int initialSize){ this.values = new ArrayList<>(initialSize); } @SuppressWarnings("unchecked") public <T> T get(int idx) { return (T) this.values.get(idx); } public void add(Object... values){ for (Object value : values) { this.values.add(value); } } public int size(){ return this.values.size(); } public Tuple clone(){ Tuple cloned = new Tuple(this.values.size()); cloned.values.addAll(this.values); return cloned; } @Override public String toString(){ return values.toString(); } @Override public int hashCode(){ int hashCode = this.values.hashCode(); return hashCode; } @Override public boolean equals(Object obj) { if (obj instanceof Tuple){ Tuple that = (Tuple) obj; return this.values.equals(that.values); } return false; } @Override public int compareTo(Object that) { if (this.equals(that)){ return 0; } return -1; } } /** * * @param <A> * @param <B> */ public static interface Tuple2<A,B> { @SuppressWarnings("unchecked") public static <A,B> Tuple2<A,B> tuple2(A _1, B _2) { return (Tuple2<A,B>) new Tuple(_1, _2); } default A _1() { return ((Tuple)this).get(0); } default B _2() { return ((Tuple)this).get(1); } } /** * * @param <A> * @param <B> * @param <C> */ public interface Tuple3<A,B,C> extends Tuple2<A,B>{ @SuppressWarnings("unchecked") public static <A,B,C> Tuple3<A,B,C> tuple3(A _1, B _2, C _3) { return (Tuple3<A,B,C>) new Tuple(_1, _2, _3); } default C _3() { return ((Tuple)this).get(2); } } /** * * @param <A> * @param <B> * @param <C> * @param <D> */ public interface Tuple4<A,B,C,D> extends Tuple3<A,B,C>{ @SuppressWarnings("unchecked") public static <A,B,C,D> Tuple4<A,B,C,D> tuple4(A _1, B _2, C _3, D _4) { return (Tuple4<A,B,C,D>) new Tuple(_1, _2, _3, _4); } default D _4() { return ((Tuple)this).get(3); } } /** * * @param <A> * @param <B> * @param <C> * @param <D> * @param <E> */ public interface Tuple5<A,B,C,D,E> extends Tuple4<A,B,C,D>{ @SuppressWarnings("unchecked") public static <A,B,C,D,E> Tuple5<A,B,C,D,E> tuple5(A _1, B _2, C _3, D _4, E _5) { return (Tuple5<A,B,C,D,E>) new Tuple(_1, _2, _3, _4, _5); } default E _5() { return ((Tuple)this).get(4); } } /** * * @param <A> * @param <B> * @param <C> * @param <D> * @param <E> * @param <F> */ public interface Tuple6<A,B,C,D,E,F> extends Tuple5<A,B,C,D,E>{ @SuppressWarnings("unchecked") public static <A,B,C,D,E,F> Tuple6<A,B,C,D,E,F> tuple6(A _1, B _2, C _3, D _4, E _5, F _6) { return (Tuple6<A,B,C,D,E,F>) new Tuple(_1, _2, _3, _4, _5, _6); } default F _6() { return ((Tuple)this).get(5); } } }