--- /dev/null
+package org.simantics.graph.store;\r
+\r
+import gnu.trove.map.hash.TIntIntHashMap;\r
+import gnu.trove.map.hash.TIntObjectHashMap;\r
+import gnu.trove.procedure.TIntObjectProcedure;\r
+import gnu.trove.procedure.TIntProcedure;\r
+import gnu.trove.set.hash.TIntHashSet;\r
+\r
+import java.util.ArrayList;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.adapter.AdaptException;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.binding.mutable.Variant;\r
+import org.simantics.databoard.serialization.Serializer;\r
+import org.simantics.databoard.type.Datatype;\r
+import org.simantics.graph.representation.Value;\r
+\r
+public class ValueStore implements IStore {\r
+ \r
+ public static Binding DatatypeBinding =\r
+ Bindings.getBindingUnchecked(Datatype.class);\r
+ public static Serializer DatatypeSerializer =\r
+ Bindings.getSerializerUnchecked(DatatypeBinding);\r
+ \r
+ TIntObjectHashMap<Variant> byteValues = new TIntObjectHashMap<Variant>();\r
+ TIntObjectHashMap<Datatype> datatypeValues = new TIntObjectHashMap<Datatype>();\r
+ TIntHashSet collisions = new TIntHashSet();\r
+ \r
+ public void map(final TIntIntHashMap map) {\r
+ collisions = IndexMappingUtils.map(map, collisions);\r
+ byteValues = IndexMappingUtils.map(map, byteValues, collisions);\r
+ datatypeValues = IndexMappingUtils.map(map, datatypeValues, collisions);\r
+ }\r
+ \r
+ public void setValue(int id, Variant value) {\r
+ if(byteValues.put(id, value) != null)\r
+ collisions.add(id);\r
+ }\r
+ \r
+ public void setValue(int id, Datatype value) {\r
+ datatypeValues.put(id, value);\r
+ }\r
+\r
+ public Variant getByteValue(int id) {\r
+ return byteValues.get(id);\r
+ }\r
+ \r
+ private static final Binding DATATYPE_BINDING = \r
+ Bindings.getBindingUnchecked(Datatype.class);\r
+ \r
+ public Datatype getDatatypeValue(int id) {\r
+ Datatype datatype = datatypeValues.get(id);\r
+ if(datatype == null) {\r
+ Variant bytes = byteValues.get(id);\r
+ if(bytes != null)\r
+ try {\r
+ return (Datatype)bytes.getValue(DATATYPE_BINDING);\r
+ } catch (AdaptException e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ }\r
+ return datatype;\r
+ }\r
+\r
+ public Value[] toArray() {\r
+ final ArrayList<Value> values = new ArrayList<Value>();\r
+ byteValues.forEachEntry(new TIntObjectProcedure<Variant>() {\r
+ @Override\r
+ public boolean execute(int a, Variant b) {\r
+ values.add(new Value(a, b));\r
+ return true;\r
+ }\r
+ });\r
+ datatypeValues.forEachEntry(new TIntObjectProcedure<Datatype>() {\r
+ Binding datatypeBinding = Bindings.getBindingUnchecked(Datatype.class);\r
+ @Override\r
+ public boolean execute(int a, Datatype b) {\r
+ if(!byteValues.containsKey(a))\r
+ try {\r
+ if(b == null)\r
+ System.out.println("Resource " + a + " has null Datatype value.");\r
+ else\r
+ values.add(new Value(a, new Variant(datatypeBinding, b)));\r
+ } catch (Exception e) {\r
+ throw new RuntimeException(e);\r
+ }\r
+ return true;\r
+ }\r
+ });\r
+ return values.toArray(new Value[values.size()]);\r
+ }\r
+ \r
+ public void collectReferences(final boolean[] set) {\r
+ TIntProcedure proc = new TIntProcedure() { \r
+ @Override\r
+ public boolean execute(int value) {\r
+ set[value] = true;\r
+ return true;\r
+ }\r
+ };\r
+ \r
+ byteValues.forEach(proc);\r
+ datatypeValues.forEach(proc);\r
+ }\r
+ \r
+ public TIntHashSet getCollisions() {\r
+ datatypeValues.forEachKey(new TIntProcedure() {\r
+ @Override\r
+ public boolean execute(int value) {\r
+ if(byteValues.containsKey(value))\r
+ collisions.add(value);\r
+ return true;\r
+ }\r
+ });\r
+ return collisions;\r
+ }\r
+}\r