package com.njzscloud.common.core.tuple;

/**
 * 3 元组
 *
 * @param <_0>
 * @param <_1>
 * @param <_2>
 */
public class Tuple3<_0, _1, _2> extends Tuple2<_0, _1> {

    /**
     * 元组大小
     */
    public final int size = 3;

    /**
     * 第 2 个数据
     */
    protected final _2 _2_;

    /**
     * 构造方法
     *
     * @param _0_ 第 0 个数据
     * @param _1_ 第 1 个数据
     * @param _2_ 第 2 个数据
     */
    protected Tuple3(_0 _0_, _1 _1_, _2 _2_) {
        super(_0_, _1_);
        this._2_ = _2_;
    }

    /**
     * 创建 Tuple3
     *
     * @param _0_ 第 0 个数据
     * @param _1_ 第 1 个数据
     * @param _2_ 第 2 个数据
     * @return Tuple3&lt;__0, __1, __2&gt;
     */
    public static <__0, __1, __2> Tuple3<__0, __1, __2> create(__0 _0_, __1 _1_, __2 _2_) {
        return new Tuple3<>(_0_, _1_, _2_);
    }

    /**
     * 获取第 2 个数据
     */
    public _2 get_2() {
        return _2_;
    }

    /**
     * <p>按索引获取数据</p>
     * <p>索引越界将返回 null</p>
     *
     * @param index 索引
     * @return T
     */
    @Override
    @SuppressWarnings("unchecked")
    public <T> T get(int index) {
        switch (index) {
            case 0:
                return (T) this._0_;
            case 1:
                return (T) this._1_;
            case 2:
                return (T) this._2_;
            default:
                return null;
        }
    }

    /**
     * 转换成 数组
     *
     * @return Object[]
     */
    @Override
    public Object[] toArray() {
        return new Object[]{this._0_, this._1_, this._2_};
    }
}
