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