-/*******************************************************************************\r
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
- * in Industry THTH ry.\r
- * All rights reserved. This program and the accompanying materials\r
- * are made available under the terms of the Eclipse Public License v1.0\r
- * which accompanies this distribution, and is available at\r
- * http://www.eclipse.org/legal/epl-v10.html\r
- *\r
- * Contributors:\r
- * VTT Technical Research Centre of Finland - initial API and implementation\r
- *******************************************************************************/\r
-package org.simantics.utils.datastructures.map;\r
-\r
-import java.io.Externalizable;\r
-import java.io.IOException;\r
-import java.io.ObjectInput;\r
-import java.io.ObjectOutput;\r
-import java.io.Serializable;\r
-import java.util.Arrays;\r
-\r
-/**\r
- * n-tuple (all fields are set) or n-tuple query (some fields possibly null)\r
- *\r
- * @author Toni Kalajainen <toni.kalajainen@vtt.fi>\r
- */\r
-public class Tuple implements Serializable, Externalizable {\r
-\r
- Object[] fields;\r
- private int hashCode;\r
- int associativity;\r
- \r
- Tuple() {}\r
- \r
- public Tuple(Object ... fields)\r
- {\r
- this.fields = fields;\r
- hashCode = Arrays.hashCode(fields);\r
- int mask = 1;\r
- for (Object o : fields) {\r
- if (o!=null) associativity |= mask;\r
- mask <<= 1;\r
- }\r
- }\r
- \r
- @Override\r
- public int hashCode() {\r
- return hashCode;\r
- }\r
- \r
- @Override\r
- public boolean equals(Object obj) {\r
- if (obj == null) return false;\r
- if (!(obj.getClass().equals(this.getClass()))) return false; \r
- Tuple other = (Tuple) obj;\r
- return Arrays.deepEquals(fields, other.fields);\r
- }\r
- \r
- @Override\r
- public String toString() {\r
- return Arrays.toString(fields);\r
- }\r
- \r
- public Object getField(int index)\r
- {\r
- return fields[index];\r
- }\r
- \r
- public Object tryGetField(int index)\r
- {\r
- return index >= 0 && index < fields.length ? fields[index] : null;\r
- }\r
- \r
- @SuppressWarnings("unchecked")\r
- public <T> T getTypedField(int index)\r
- {\r
- return (T) fields[index];\r
- }\r
- \r
- @SuppressWarnings("unchecked")\r
- public <T> T tryGetTypedField(int index)\r
- {\r
- return index >= 0 && index < fields.length ? (T) fields[index] : null;\r
- }\r
- \r
- public Object[] getFields()\r
- {\r
- return fields;\r
- }\r
- \r
- public int getLevel()\r
- {\r
- return fields.length;\r
- }\r
- \r
- public int getAssociativity() \r
- {\r
- return associativity;\r
- }\r
-\r
- /**\r
- * Tuple is full if all fields are set (not null) \r
- * @return <code>true</code> if all fields are set\r
- */\r
- public boolean isFull()\r
- {\r
- return associativity == (1 << fields.length)-1;\r
- }\r
- \r
- @Override\r
- public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {\r
- int count = in.readInt();\r
- fields = new Object[count];\r
- for (int i=0; i<count; i++)\r
- fields[i] = in.readObject();\r
- hashCode = Arrays.hashCode(fields);\r
- }\r
-\r
- @Override\r
- public void writeExternal(ObjectOutput out) throws IOException {\r
- out.writeInt(fields.length);\r
- for (Object o : fields)\r
- out.writeObject(o);\r
- }\r
- \r
-}\r
-\r
+/*******************************************************************************
+ * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * in Industry THTH ry.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * VTT Technical Research Centre of Finland - initial API and implementation
+ *******************************************************************************/
+package org.simantics.utils.datastructures.map;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+import java.util.Arrays;
+
+/**
+ * n-tuple (all fields are set) or n-tuple query (some fields possibly null)
+ *
+ * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
+ */
+public class Tuple implements Serializable, Externalizable {
+
+ Object[] fields;
+ private int hashCode;
+ int associativity;
+
+ Tuple() {}
+
+ public Tuple(Object ... fields)
+ {
+ this.fields = fields;
+ hashCode = Arrays.hashCode(fields);
+ int mask = 1;
+ for (Object o : fields) {
+ if (o!=null) associativity |= mask;
+ mask <<= 1;
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return hashCode;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null) return false;
+ if (!(obj.getClass().equals(this.getClass()))) return false;
+ Tuple other = (Tuple) obj;
+ return Arrays.deepEquals(fields, other.fields);
+ }
+
+ @Override
+ public String toString() {
+ return Arrays.toString(fields);
+ }
+
+ public Object getField(int index)
+ {
+ return fields[index];
+ }
+
+ public Object tryGetField(int index)
+ {
+ return index >= 0 && index < fields.length ? fields[index] : null;
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> T getTypedField(int index)
+ {
+ return (T) fields[index];
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> T tryGetTypedField(int index)
+ {
+ return index >= 0 && index < fields.length ? (T) fields[index] : null;
+ }
+
+ public Object[] getFields()
+ {
+ return fields;
+ }
+
+ public int getLevel()
+ {
+ return fields.length;
+ }
+
+ public int getAssociativity()
+ {
+ return associativity;
+ }
+
+ /**
+ * Tuple is full if all fields are set (not null)
+ * @return <code>true</code> if all fields are set
+ */
+ public boolean isFull()
+ {
+ return associativity == (1 << fields.length)-1;
+ }
+
+ @Override
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ int count = in.readInt();
+ fields = new Object[count];
+ for (int i=0; i<count; i++)
+ fields[i] = in.readObject();
+ hashCode = Arrays.hashCode(fields);
+ }
+
+ @Override
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeInt(fields.length);
+ for (Object o : fields)
+ out.writeObject(o);
+ }
+
+}
+