001/*
002 * BridJ - Dynamic and blazing-fast native interop for Java.
003 * http://bridj.googlecode.com/
004 *
005 * Copyright (c) 2010-2013, Olivier Chafik (http://ochafik.com/)
006 * All rights reserved.
007 *
008 * Redistribution and use in source and binary forms, with or without
009 * modification, are permitted provided that the following conditions are met:
010 * 
011 *     * Redistributions of source code must retain the above copyright
012 *       notice, this list of conditions and the following disclaimer.
013 *     * Redistributions in binary form must reproduce the above copyright
014 *       notice, this list of conditions and the following disclaimer in the
015 *       documentation and/or other materials provided with the distribution.
016 *     * Neither the name of Olivier Chafik nor the
017 *       names of its contributors may be used to endorse or promote products
018 *       derived from this software without specific prior written permission.
019 * 
020 * THIS SOFTWARE IS PROVIDED BY OLIVIER CHAFIK AND CONTRIBUTORS ``AS IS'' AND ANY
021 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
022 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
023 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
024 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
025 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
026 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
027 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
028 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
029 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
030 */
031package org.bridj.util;
032
033public class Tuple {
034
035    protected final Object[] data;
036
037    public Tuple(Object[] data) {
038        this.data = data;
039    }
040
041    public Tuple(int n) {
042        this.data = new Object[n];
043    }
044
045    @Override
046    public int hashCode() {
047        int h = 0;
048        for (int i = 0, n = size(); i < n; i++) {
049            Object o = get(i);
050            if (o == null) {
051                continue;
052            }
053            h ^= o.hashCode();
054        }
055        return h;
056    }
057
058    @Override
059    public boolean equals(Object obj) {
060        if (obj == null || !(obj instanceof Tuple)) {
061            return false;
062        }
063        Tuple t = (Tuple) obj;
064        int s = size();
065        if (t.size() != s) {
066            return false;
067        }
068        for (int i = 0; i < s; i++) {
069            Object o1 = get(i), o2 = t.get(i);
070            if (o1 == null) {
071                if (o2 != null) {
072                    return false;
073                }
074            } else if (!o1.equals(o2)) {
075                return false;
076            }
077        }
078        return true;
079    }
080
081    public Object get(int index) {
082        return data[index];
083    }
084
085    public void set(int index, Object value) {
086        data[index] = value;
087    }
088
089    public int size() {
090        return data.length;
091    }
092
093    @Override
094    public String toString() {
095        StringBuilder b = new StringBuilder("{");
096        for (int i = 0, n = size(); i < n; i++) {
097            if (i != 0) {
098                b.append(',');
099            }
100            b.append('\n');
101            b.append('\t').append(get(i));
102        }
103        b.append("\n}");
104        return b.toString();
105    }
106}