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 }