001package com.nativelibs4java.util;
002
003/**
004 *
005 * @author ochafik
006 */
007import java.util.Map;
008
009public class Pair<U, V> implements Comparable<Pair<U, V>>, Map.Entry<U, V> {
010        private U first;
011        private V second;
012        
013        public Pair(U first, V second) {
014                this.first = first;
015                this.second = second;
016        }
017        
018        public Pair() {}
019
020        public U getFirst() {
021                return first;
022        }
023        
024        public V getSecond() {
025                return second;
026        }
027        
028        public void setFirst(U first) {
029                this.first = first;
030        }
031        
032        public void setSecond(V second) {
033                this.second = second;
034        }
035        
036        @SuppressWarnings("unchecked")
037        public int compareTo(Pair<U, V> o) {
038                Comparable<U> cu = (Comparable<U>)getFirst();
039                if (cu == null) {
040                        if (first != null)
041                                return 1;
042                } else {
043                        int d = cu.compareTo(o.getFirst());
044                        if (d != 0)
045                                return d;
046                }
047                
048                Comparable<V> cv = (Comparable<V>)getSecond();
049                if (cv == null)
050                        return second != null ? 1 : -1;
051                return cv.compareTo(o.getSecond());
052        }
053        
054        @Override
055        public String toString() {
056                return "Pair("+first+", "+second+")";
057        }
058
059        public U getKey() {
060                return first;
061        }
062
063        public V getValue() {
064                return second;
065        }
066
067        public V setValue(V value) {
068                V oldValue = second;
069                second = value;
070                return oldValue;
071        }
072
073        @Override
074        public int hashCode() {
075                final int prime = 31;
076                int result = 1;
077                result = prime * result + ((first == null) ? 0 : first.hashCode());
078                result = prime * result + ((second == null) ? 0 : second.hashCode());
079                return result;
080        }
081
082        @Override
083        public boolean equals(Object obj) {
084                if (this == obj)
085                        return true;
086                if (obj == null)
087                        return false;
088                if (getClass() != obj.getClass())
089                        return false;
090                final Pair<?, ?> other = (Pair<?, ?>) obj;
091                if (first == null) {
092                        if (other.first != null)
093                                return false;
094                } else if (!first.equals(other.first))
095                        return false;
096                if (second == null) {
097                        if (other.second != null)
098                                return false;
099                } else if (!second.equals(other.second))
100                        return false;
101                return true;
102        }
103
104        public boolean isFull() {
105                return getFirst() != null && getSecond() != null;
106        }
107        
108        public boolean isEmpty() {
109                return getFirst() == null && getSecond() == null;
110        }
111}