]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.graph/src/org/simantics/graph/store/ValueStore.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.graph / src / org / simantics / graph / store / ValueStore.java
diff --git a/bundles/org.simantics.graph/src/org/simantics/graph/store/ValueStore.java b/bundles/org.simantics.graph/src/org/simantics/graph/store/ValueStore.java
new file mode 100644 (file)
index 0000000..96f8b0d
--- /dev/null
@@ -0,0 +1,118 @@
+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