]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.utils.datastructures/src/org/simantics/utils/datastructures/map/Tuple.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.utils.datastructures / src / org / simantics / utils / datastructures / map / Tuple.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 package org.simantics.utils.datastructures.map;\r
13 \r
14 import java.io.Externalizable;\r
15 import java.io.IOException;\r
16 import java.io.ObjectInput;\r
17 import java.io.ObjectOutput;\r
18 import java.io.Serializable;\r
19 import java.util.Arrays;\r
20 \r
21 /**\r
22  * n-tuple (all fields are set) or n-tuple query (some fields possibly null)\r
23  *\r
24  * @author Toni Kalajainen <toni.kalajainen@vtt.fi>\r
25  */\r
26 public class Tuple implements Serializable, Externalizable {\r
27 \r
28         Object[] fields;\r
29         private int hashCode;\r
30         int associativity;\r
31         \r
32         Tuple() {}\r
33         \r
34         public Tuple(Object ... fields)\r
35         {\r
36                 this.fields = fields;\r
37                 hashCode = Arrays.hashCode(fields);\r
38                 int mask = 1;\r
39                 for (Object o : fields) {\r
40                         if (o!=null) associativity |= mask;\r
41                         mask <<= 1;\r
42                 }\r
43         }\r
44         \r
45         @Override\r
46         public int hashCode() {\r
47                 return hashCode;\r
48         }\r
49         \r
50         @Override\r
51         public boolean equals(Object obj) {\r
52         if (obj == null) return false;\r
53         if (!(obj.getClass().equals(this.getClass()))) return false;        \r
54                 Tuple other = (Tuple) obj;\r
55                 return Arrays.deepEquals(fields, other.fields);\r
56         }\r
57         \r
58     @Override\r
59     public String toString() {\r
60         return Arrays.toString(fields);\r
61     }\r
62     \r
63     public Object getField(int index)\r
64     {\r
65         return fields[index];\r
66     }\r
67     \r
68     public Object tryGetField(int index)\r
69     {\r
70         return index >= 0 && index < fields.length ? fields[index] : null;\r
71     }\r
72     \r
73     @SuppressWarnings("unchecked")\r
74     public <T> T getTypedField(int index)\r
75     {\r
76         return (T) fields[index];\r
77     }\r
78     \r
79     @SuppressWarnings("unchecked")\r
80     public <T> T tryGetTypedField(int index)\r
81     {\r
82         return index >= 0 && index < fields.length ? (T) fields[index] : null;\r
83     }\r
84     \r
85     public Object[] getFields()\r
86     {\r
87         return fields;\r
88     }\r
89     \r
90     public int getLevel()\r
91     {\r
92         return fields.length;\r
93     }\r
94     \r
95     public int getAssociativity() \r
96     {\r
97         return associativity;\r
98     }\r
99 \r
100         /**\r
101          * Tuple is full if all fields are set (not null) \r
102          * @return <code>true</code> if all fields are set\r
103          */\r
104         public boolean isFull()\r
105         {\r
106                 return associativity == (1 << fields.length)-1;\r
107         }\r
108     \r
109         @Override\r
110         public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {\r
111                 int count = in.readInt();\r
112                 fields = new Object[count];\r
113                 for (int i=0; i<count; i++)\r
114                         fields[i] = in.readObject();\r
115                 hashCode = Arrays.hashCode(fields);\r
116         }\r
117 \r
118         @Override\r
119         public void writeExternal(ObjectOutput out) throws IOException {\r
120                 out.writeInt(fields.length);\r
121                 for (Object o : fields)\r
122                         out.writeObject(o);\r
123         }\r
124                 \r
125 }\r
126 \r