a bug fix...
[IRC.git] / Robust / src / Util / MultiKey.java
1 ////////////////////////////////////////////
2 //
3 //  A MultiKey is a vector of Objects that
4 //  serves as a key.  One MultiKey is equal
5 //  to another if they have the same number
6 //  of Objects, and Objects in corresponding
7 //  positions are equal.
8 //
9 ////////////////////////////////////////////
10 package Util;
11
12
13 public class MultiKey {
14
15   static public MultiKey factory( Object... keys ) {
16     return new MultiKey( keys );
17   }
18
19
20   private Object[] keys;
21
22   public MultiKey( Object[] keys ) {
23     if( keys.length == 0 ) {
24       throw new IllegalArgumentException( "A MultiKey must have at least one key." );
25     }
26     for( int i = 0; i < keys.length; ++i ) {
27       if( keys[i] == null ) {
28         throw new IllegalArgumentException( "A MultiKey cannot have null elements." );
29       }
30     }
31     this.keys = keys.clone();
32   }
33
34   public boolean typesMatch( Class[] keyTypes ) {
35     if( keys.length != keyTypes.length ) {
36       return false;
37     }
38     for( int i = 0; i < keys.length; ++i ) {
39       if( !(keyTypes[i].isInstance( keys[i] )) ) {
40         return false;
41       }
42     }
43     return true;
44   }
45
46   public Object get( int index ) {
47     if( index < 0 || index >= keys.length ) {
48       throw new IllegalArgumentException( "Index "+index+" is out of range for this MultiKey." );
49     }
50     return keys[index];
51   }
52
53   public boolean equals( Object o ) {
54     if( this == o ) {
55       return true;
56     }
57     if( o == null ) {
58       return false;
59     }
60     if( !(o instanceof MultiKey) ) {
61       return false;
62     }
63     MultiKey mk = (MultiKey) o;
64     if( this.keys.length != mk.keys.length ) {
65       return false;
66     }
67     for( int i = 0; i < keys.length; ++i ) {
68       if( !this.keys[i].equals( mk.keys[i] ) ) {
69         return false;
70       }
71     }
72     return true;
73   }
74
75   public int hashCode() {
76     int hash = 1;
77     for( Object key : keys ) {
78       hash = hash*31 + key.hashCode();
79     }
80     return hash;
81   }
82
83   public String toString() {
84     StringBuilder s = new StringBuilder( "MK[" );
85     for( int i = 0; i < keys.length; ++i ) {
86       s.append( keys[i].toString() );
87       if( i < keys.length - 1 ) {
88         s.append( ", " );
89       }
90     }
91     s.append( "]" );
92     return s.toString();
93   }
94 }