diff options
Diffstat (limited to 'Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java')
-rw-r--r-- | Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java index 0c00108b..b6a615ed 100644 --- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java | |||
@@ -5,6 +5,7 @@ import java.util.Map; | |||
5 | import java.util.Set; | 5 | import java.util.Set; |
6 | 6 | ||
7 | import org.eclipse.viatra.solver.data.map.internal.ImmutableNode; | 7 | import org.eclipse.viatra.solver.data.map.internal.ImmutableNode; |
8 | import org.eclipse.viatra.solver.data.map.internal.MapDiffCursor; | ||
8 | import org.eclipse.viatra.solver.data.map.internal.Node; | 9 | import org.eclipse.viatra.solver.data.map.internal.Node; |
9 | import org.eclipse.viatra.solver.data.map.internal.VersionedMapImpl; | 10 | import org.eclipse.viatra.solver.data.map.internal.VersionedMapImpl; |
10 | 11 | ||
@@ -25,7 +26,7 @@ public class VersionedMapStoreImpl<KEY,VALUE> implements VersionedMapStore<KEY, | |||
25 | nodeCache = new HashMap<>(); | 26 | nodeCache = new HashMap<>(); |
26 | } | 27 | } |
27 | 28 | ||
28 | Set<Long> getStates() { | 29 | synchronized Set<Long> getStates() { |
29 | return states.keySet(); | 30 | return states.keySet(); |
30 | } | 31 | } |
31 | 32 | ||
@@ -34,29 +35,54 @@ public class VersionedMapStoreImpl<KEY,VALUE> implements VersionedMapStore<KEY, | |||
34 | return new VersionedMapImpl<KEY,VALUE>(this,hashProvider,defaultValue); | 35 | return new VersionedMapImpl<KEY,VALUE>(this,hashProvider,defaultValue); |
35 | } | 36 | } |
36 | @Override | 37 | @Override |
37 | public VersionedMap<KEY,VALUE> createMap(long state) throws IllegalAccessException { | 38 | public VersionedMap<KEY,VALUE> createMap(long state) { |
38 | ImmutableNode<KEY, VALUE> data = getStateData(state); | 39 | ImmutableNode<KEY, VALUE> data = revert(state); |
39 | if(data != null) { | 40 | if(data != null) { |
40 | return new VersionedMapImpl<KEY,VALUE>(this,hashProvider,defaultValue,data); | 41 | return new VersionedMapImpl<KEY,VALUE>(this,hashProvider,defaultValue,data); |
41 | } else { | 42 | } else { |
42 | throw new IllegalAccessException("Store does not contain state " + state + "!"); | 43 | throw new IllegalArgumentException("Store does not contain state " + state + "!"); |
43 | } | 44 | } |
44 | } | 45 | } |
45 | |||
46 | private long getNextID() { | ||
47 | if(nextID == Long.MAX_VALUE) throw new IllegalStateException("Map store run out of Id-s"); | ||
48 | return nextID++; | ||
49 | } | ||
50 | 46 | ||
51 | public ImmutableNode<KEY,VALUE> getStateData(long state) { | 47 | synchronized public ImmutableNode<KEY,VALUE> revert(long state) { |
52 | return states.get(state); | 48 | return states.get(state); |
53 | } | 49 | } |
54 | public Map<Node<KEY,VALUE>, ImmutableNode<KEY,VALUE>> getStore() { | 50 | synchronized public long commit(Node<KEY,VALUE> data, VersionedMapImpl<KEY, VALUE> mapToUpdateRoot) { |
55 | return this.nodeCache; | 51 | ImmutableNode<KEY,VALUE> immutable; |
56 | } | 52 | if(data != null) { |
57 | public long addState(ImmutableNode<KEY,VALUE> data) { | 53 | if(this.nodeCache != null) { |
58 | long id = getNextID(); | 54 | immutable = data.toImmutable(this.nodeCache); |
59 | states.put(id,data); | 55 | } else { |
56 | immutable = data.toImmutable(); | ||
57 | } | ||
58 | } else { | ||
59 | immutable = null; | ||
60 | } | ||
61 | |||
62 | |||
63 | if(nextID == Long.MAX_VALUE) throw new IllegalStateException( | ||
64 | "Map store run out of Id-s"); | ||
65 | long id = nextID++; | ||
66 | this.states.put(id, immutable); | ||
67 | //mapToUpdateRoot.setRoot(immutable); | ||
60 | return id; | 68 | return id; |
61 | } | 69 | } |
70 | |||
71 | // public Map<Node<KEY,VALUE>, ImmutableNode<KEY,VALUE>> getStore() { | ||
72 | // return this.nodeCache; | ||
73 | // } | ||
74 | // public long addState(ImmutableNode<KEY,VALUE> data) { | ||
75 | // | ||
76 | // states.put(id,data); | ||
77 | // return id; | ||
78 | // } | ||
79 | |||
80 | @Override | ||
81 | public DiffCursor<KEY, VALUE> getDiffCursor(long fromState, long toState) { | ||
82 | VersionedMap<KEY, VALUE> map1 = createMap(fromState); | ||
83 | VersionedMap<KEY, VALUE> map2 = createMap(toState); | ||
84 | Cursor<KEY, VALUE> cursor1 = map1.getCursor(); | ||
85 | Cursor<KEY, VALUE> cursor2 = map2.getCursor(); | ||
86 | return new MapDiffCursor<KEY, VALUE>(this.defaultValue,cursor1,cursor2); | ||
87 | } | ||
62 | } | 88 | } |