diff options
author | Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7> | 2021-07-06 17:15:08 +0200 |
---|---|---|
committer | Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7> | 2021-07-06 17:15:08 +0200 |
commit | 3b414dbe470eae1f34e052b417942c47fdb7e517 (patch) | |
tree | af39d7b8b4052ade0c647fdcf32268cdf1198158 /Solvers | |
parent | Test environment update (diff) | |
download | VIATRA-Generator-3b414dbe470eae1f34e052b417942c47fdb7e517.tar.gz VIATRA-Generator-3b414dbe470eae1f34e052b417942c47fdb7e517.tar.zst VIATRA-Generator-3b414dbe470eae1f34e052b417942c47fdb7e517.zip |
VersionedMapStore first implementation, tests reinterpreted
Diffstat (limited to 'Solvers')
13 files changed, 230 insertions, 94 deletions
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/Cursor.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/Cursor.java new file mode 100644 index 00000000..81c7a7ec --- /dev/null +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/Cursor.java | |||
@@ -0,0 +1,8 @@ | |||
1 | package org.eclipse.viatra.solver.data.map; | ||
2 | |||
3 | public interface Cursor<KEY,VALUE> { | ||
4 | public KEY getKey(); | ||
5 | public VALUE getValue(); | ||
6 | public boolean isTerminated(); | ||
7 | public boolean move(); | ||
8 | } | ||
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/Versioned.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/Versioned.java index d58c458e..68970a94 100644 --- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/Versioned.java +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/Versioned.java | |||
@@ -2,5 +2,6 @@ package org.eclipse.viatra.solver.data.map; | |||
2 | 2 | ||
3 | public interface Versioned { | 3 | public interface Versioned { |
4 | public long commit(); | 4 | public long commit(); |
5 | //public void revert(); | ||
5 | public void restore(long state); | 6 | public void restore(long state); |
6 | } | 7 | } |
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java index 4328fde1..3d691407 100644 --- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java | |||
@@ -3,72 +3,10 @@ package org.eclipse.viatra.solver.data.map; | |||
3 | import java.util.Iterator; | 3 | import java.util.Iterator; |
4 | import java.util.Map; | 4 | import java.util.Map; |
5 | 5 | ||
6 | import org.eclipse.viatra.solver.data.map.internal.MapCursor; | 6 | public interface VersionedMap<KEY,VALUE> extends Versioned{ |
7 | import org.eclipse.viatra.solver.data.map.internal.MapEntryIterator; | 7 | public void put(KEY key, VALUE value); |
8 | import org.eclipse.viatra.solver.data.map.internal.MutableNode; | 8 | public VALUE get(KEY key); |
9 | import org.eclipse.viatra.solver.data.map.internal.Node; | 9 | public int getSize(); |
10 | 10 | public Iterator<Map.Entry<KEY,VALUE>> getIterator(); | |
11 | public class VersionedMap<KEY,VALUE> implements Versioned{ | 11 | public Cursor<KEY,VALUE> getCursor(); |
12 | protected final ContinousHashProvider<? super KEY> hashProvider; | ||
13 | protected final VALUE defaultValue; | ||
14 | protected Node<KEY,VALUE> root = null; | ||
15 | //TODO: protected final iterators | ||
16 | |||
17 | protected VersionedMap(ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue) { | ||
18 | this.hashProvider = hashProvider; | ||
19 | this.defaultValue = defaultValue; | ||
20 | } | ||
21 | |||
22 | public VALUE getDefaultValue() { | ||
23 | return defaultValue; | ||
24 | } | ||
25 | public ContinousHashProvider<? super KEY> getHashProvider() { | ||
26 | return hashProvider; | ||
27 | } | ||
28 | |||
29 | public void put(KEY key, VALUE value) { | ||
30 | if(root!=null) { | ||
31 | root = root.putValue(key, value, hashProvider, defaultValue, hashProvider.getHash(key, 0), 0); | ||
32 | } else { | ||
33 | root = MutableNode.initialize(key, value, hashProvider, defaultValue); | ||
34 | } | ||
35 | } | ||
36 | public VALUE get(KEY key) { | ||
37 | if(root!=null) { | ||
38 | return root.getValue(key, hashProvider, defaultValue, hashProvider.getHash(key, 0), 0); | ||
39 | } else { | ||
40 | return defaultValue; | ||
41 | } | ||
42 | } | ||
43 | public int getSize() { | ||
44 | if(root == null) { | ||
45 | return 0; | ||
46 | } else { | ||
47 | return root.getSize(); | ||
48 | } | ||
49 | } | ||
50 | Iterator<Map.Entry<KEY,VALUE>> getIterator() { | ||
51 | return new MapEntryIterator<>(this.root); | ||
52 | } | ||
53 | |||
54 | @Override | ||
55 | public long commit() { | ||
56 | // TODO Auto-generated method stub | ||
57 | return 0; | ||
58 | } | ||
59 | |||
60 | @Override | ||
61 | public void restore(long state) { | ||
62 | // TODO Auto-generated method stub | ||
63 | } | ||
64 | |||
65 | public void prettyPrint() { | ||
66 | StringBuilder s = new StringBuilder(); | ||
67 | if(this.root != null) { | ||
68 | this.root.prettyPrint(s, 0, -1); | ||
69 | System.out.println(s.toString()); | ||
70 | } else { | ||
71 | System.out.println("empty tree"); | ||
72 | } | ||
73 | } | ||
74 | } | 12 | } |
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStore.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStore.java new file mode 100644 index 00000000..5a54c13b --- /dev/null +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStore.java | |||
@@ -0,0 +1,11 @@ | |||
1 | package org.eclipse.viatra.solver.data.map; | ||
2 | |||
3 | public interface VersionedMapStore<KEY, VALUE> { | ||
4 | |||
5 | public VersionedMap<KEY, VALUE> createMap(); | ||
6 | |||
7 | public VersionedMap<KEY, VALUE> createMap(long state) throws IllegalAccessException; | ||
8 | |||
9 | // long addState(Node<KEY, VALUE> data); | ||
10 | //public void removeState(long state); | ||
11 | } \ No newline at end of file | ||
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 new file mode 100644 index 00000000..1e1352ab --- /dev/null +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMapStoreImpl.java | |||
@@ -0,0 +1,61 @@ | |||
1 | package org.eclipse.viatra.solver.data.map; | ||
2 | |||
3 | import java.util.HashMap; | ||
4 | import java.util.Map; | ||
5 | import java.util.Set; | ||
6 | |||
7 | import org.eclipse.viatra.solver.data.map.internal.ImmutableNode; | ||
8 | import org.eclipse.viatra.solver.data.map.internal.VersionedMapImpl; | ||
9 | |||
10 | public class VersionedMapStoreImpl<KEY,VALUE> implements VersionedMapStore<KEY, VALUE> { | ||
11 | protected final ContinousHashProvider<? super KEY> hashProvider; | ||
12 | protected final VALUE defaultValue; | ||
13 | protected Map<Long, ImmutableNode<KEY,VALUE>> states; | ||
14 | protected long nextID; | ||
15 | |||
16 | public VersionedMapStoreImpl(ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue) { | ||
17 | this.hashProvider = hashProvider; | ||
18 | this.defaultValue = defaultValue; | ||
19 | |||
20 | states = new HashMap<>(); | ||
21 | nextID = 0; | ||
22 | } | ||
23 | |||
24 | Set<Long> getStates() { | ||
25 | return states.keySet(); | ||
26 | } | ||
27 | |||
28 | @Override | ||
29 | public VersionedMap<KEY,VALUE> createMap() { | ||
30 | return new VersionedMapImpl<KEY,VALUE>(this,hashProvider,defaultValue); | ||
31 | } | ||
32 | @Override | ||
33 | public VersionedMap<KEY,VALUE> createMap(long state) throws IllegalAccessException { | ||
34 | ImmutableNode<KEY, VALUE> data = getStateData(state); | ||
35 | if(data != null) { | ||
36 | return new VersionedMapImpl<KEY,VALUE>(this,hashProvider,defaultValue,data); | ||
37 | } else { | ||
38 | throw new IllegalAccessException("Store does not contain state " + state + "!"); | ||
39 | } | ||
40 | } | ||
41 | private ImmutableNode<KEY,VALUE> getStateData(long state) { | ||
42 | return states.get(state); | ||
43 | } | ||
44 | |||
45 | public long addState(ImmutableNode<KEY,VALUE> data) { | ||
46 | if(data != null) { | ||
47 | ImmutableNode<KEY, VALUE> immutable = data.toImmutable(); | ||
48 | long id = nextID++; | ||
49 | states.put(id,immutable); | ||
50 | return id; | ||
51 | } else { | ||
52 | throw new NullPointerException("data is null!"); | ||
53 | } | ||
54 | |||
55 | } | ||
56 | // public void removeState(long state) { | ||
57 | // if(states.containsKey(state)) { | ||
58 | // this.states.remove(state); | ||
59 | // } | ||
60 | // } | ||
61 | } | ||
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java index 70c4daff..860c258a 100644 --- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java | |||
@@ -175,7 +175,7 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> { | |||
175 | } | 175 | } |
176 | 176 | ||
177 | @Override | 177 | @Override |
178 | protected ImmutableNode<KEY,VALUE> toImmutable() { | 178 | public ImmutableNode<KEY,VALUE> toImmutable() { |
179 | return this; | 179 | return this; |
180 | } | 180 | } |
181 | 181 | ||
@@ -210,7 +210,7 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> { | |||
210 | // 3. no subnode found, move up | 210 | // 3. no subnode found, move up |
211 | cursor.nodeStack.pop(); | 211 | cursor.nodeStack.pop(); |
212 | cursor.nodeIndexStack.pop(); | 212 | cursor.nodeIndexStack.pop(); |
213 | if(!cursor.nodeStack.empty()) { | 213 | if(!cursor.nodeStack.isEmpty()) { |
214 | Node<KEY, VALUE> supernode = cursor.nodeStack.peek(); | 214 | Node<KEY, VALUE> supernode = cursor.nodeStack.peek(); |
215 | return supernode.moveToNext(cursor); | 215 | return supernode.moveToNext(cursor); |
216 | } else { | 216 | } else { |
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNodeIterator.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNodeIterator.java deleted file mode 100644 index 7715bc72..00000000 --- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNodeIterator.java +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | package org.eclipse.viatra.solver.data.map.internal; | ||
2 | |||
3 | public class ImmutableNodeIterator { | ||
4 | |||
5 | } | ||
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java index 40ba55fa..9489d110 100644 --- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java | |||
@@ -1,15 +1,18 @@ | |||
1 | package org.eclipse.viatra.solver.data.map.internal; | 1 | package org.eclipse.viatra.solver.data.map.internal; |
2 | 2 | ||
3 | import java.util.Stack; | 3 | import java.util.ArrayDeque; |
4 | import java.util.Deque; | ||
4 | 5 | ||
5 | public class MapCursor<KEY,VALUE> { | 6 | import org.eclipse.viatra.solver.data.map.Cursor; |
7 | |||
8 | public class MapCursor<KEY,VALUE> implements Cursor<KEY,VALUE> { | ||
6 | // Constants | 9 | // Constants |
7 | static int IndexStart = -1; | 10 | static int IndexStart = -1; |
8 | static int IndexFinish = -2; | 11 | static int IndexFinish = -2; |
9 | 12 | ||
10 | // Tree stack | 13 | // Tree stack |
11 | Stack<Node<KEY,VALUE>> nodeStack; | 14 | Deque<Node<KEY,VALUE>> nodeStack; |
12 | Stack<Integer> nodeIndexStack; | 15 | Deque<Integer> nodeIndexStack; |
13 | int dataIndex; | 16 | int dataIndex; |
14 | 17 | ||
15 | // Values | 18 | // Values |
@@ -19,11 +22,11 @@ public class MapCursor<KEY,VALUE> { | |||
19 | public MapCursor(Node<KEY, VALUE> root) { | 22 | public MapCursor(Node<KEY, VALUE> root) { |
20 | // Initializing tree stack | 23 | // Initializing tree stack |
21 | super(); | 24 | super(); |
22 | this.nodeStack = new Stack<>(); | 25 | this.nodeStack = new ArrayDeque<>(); |
23 | if(root != null) { | 26 | if(root != null) { |
24 | this.nodeStack.add(root); | 27 | this.nodeStack.add(root); |
25 | } | 28 | } |
26 | this.nodeIndexStack = new Stack<>(); | 29 | this.nodeIndexStack = new ArrayDeque<>(); |
27 | this.nodeIndexStack.push(IndexStart); | 30 | this.nodeIndexStack.push(IndexStart); |
28 | this.dataIndex = IndexStart; | 31 | this.dataIndex = IndexStart; |
29 | 32 | ||
@@ -44,7 +47,7 @@ public class MapCursor<KEY,VALUE> { | |||
44 | } | 47 | } |
45 | 48 | ||
46 | public boolean isTerminated() { | 49 | public boolean isTerminated() { |
47 | return this.nodeStack.empty(); | 50 | return this.nodeStack.isEmpty(); |
48 | } | 51 | } |
49 | 52 | ||
50 | public boolean move() { | 53 | public boolean move() { |
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java index 4c764f2b..b22c7b14 100644 --- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java | |||
@@ -208,7 +208,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { | |||
208 | } | 208 | } |
209 | 209 | ||
210 | @Override | 210 | @Override |
211 | protected ImmutableNode<KEY,VALUE> toImmutable() { | 211 | public ImmutableNode<KEY,VALUE> toImmutable() { |
212 | return new ImmutableNode<KEY,VALUE>(this); | 212 | return new ImmutableNode<KEY,VALUE>(this); |
213 | } | 213 | } |
214 | 214 | ||
@@ -236,9 +236,11 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { | |||
236 | Node<KEY, VALUE> subnode = (Node<KEY, VALUE>) this.content[index*2+1]; | 236 | Node<KEY, VALUE> subnode = (Node<KEY, VALUE>) this.content[index*2+1]; |
237 | 237 | ||
238 | cursor.dataIndex = MapCursor.IndexStart; | 238 | cursor.dataIndex = MapCursor.IndexStart; |
239 | cursor.nodeIndexStack.set(0,index); | 239 | cursor.nodeIndexStack.pop(); |
240 | cursor.nodeStack.push(subnode); | 240 | cursor.nodeIndexStack.push(index); |
241 | cursor.nodeIndexStack.push(MapCursor.IndexStart); | 241 | cursor.nodeIndexStack.push(MapCursor.IndexStart); |
242 | cursor.nodeStack.push(subnode); | ||
243 | |||
242 | 244 | ||
243 | return subnode.moveToNext(cursor); | 245 | return subnode.moveToNext(cursor); |
244 | } | 246 | } |
@@ -246,7 +248,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { | |||
246 | // 3. no subnode found, move up | 248 | // 3. no subnode found, move up |
247 | cursor.nodeStack.pop(); | 249 | cursor.nodeStack.pop(); |
248 | cursor.nodeIndexStack.pop(); | 250 | cursor.nodeIndexStack.pop(); |
249 | if(!cursor.nodeStack.empty()) { | 251 | if(!cursor.nodeStack.isEmpty()) { |
250 | Node<KEY, VALUE> supernode = cursor.nodeStack.peek(); | 252 | Node<KEY, VALUE> supernode = cursor.nodeStack.peek(); |
251 | return supernode.moveToNext(cursor); | 253 | return supernode.moveToNext(cursor); |
252 | } else { | 254 | } else { |
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java index 9b01cfcf..ee81493f 100644 --- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java | |||
@@ -52,8 +52,8 @@ public abstract class Node<KEY,VALUE>{ | |||
52 | abstract public Node<KEY,VALUE> putValue(KEY key, VALUE value, ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue, int hash, int depth); | 52 | abstract public Node<KEY,VALUE> putValue(KEY key, VALUE value, ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue, int hash, int depth); |
53 | abstract public int getSize(); | 53 | abstract public int getSize(); |
54 | 54 | ||
55 | abstract protected MutableNode<KEY, VALUE> toMutable(); | 55 | abstract MutableNode<KEY, VALUE> toMutable(); |
56 | abstract protected ImmutableNode<KEY, VALUE> toImmutable(); | 56 | public abstract ImmutableNode<KEY, VALUE> toImmutable(); |
57 | 57 | ||
58 | /** | 58 | /** |
59 | * Moves a {@link MapCursor} to its next position. | 59 | * Moves a {@link MapCursor} to its next position. |
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/VersionedMapImpl.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/VersionedMapImpl.java new file mode 100644 index 00000000..3ea905f3 --- /dev/null +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/VersionedMapImpl.java | |||
@@ -0,0 +1,114 @@ | |||
1 | package org.eclipse.viatra.solver.data.map.internal; | ||
2 | |||
3 | import java.util.Iterator; | ||
4 | import java.util.Map; | ||
5 | |||
6 | import org.eclipse.viatra.solver.data.map.ContinousHashProvider; | ||
7 | import org.eclipse.viatra.solver.data.map.Cursor; | ||
8 | import org.eclipse.viatra.solver.data.map.VersionedMap; | ||
9 | import org.eclipse.viatra.solver.data.map.VersionedMapStore; | ||
10 | import org.eclipse.viatra.solver.data.map.VersionedMapStoreImpl; | ||
11 | |||
12 | /** | ||
13 | * Not threadSafe in itself | ||
14 | * @author Oszkar Semerath | ||
15 | * | ||
16 | * @param <KEY> | ||
17 | * @param <VALUE> | ||
18 | */ | ||
19 | public class VersionedMapImpl<KEY,VALUE> implements VersionedMap<KEY,VALUE>{ | ||
20 | protected final VersionedMapStoreImpl<KEY,VALUE> store; | ||
21 | |||
22 | protected final ContinousHashProvider<? super KEY> hashProvider; | ||
23 | protected final VALUE defaultValue; | ||
24 | protected Node<KEY,VALUE> root; | ||
25 | //TODO: protected final iterators | ||
26 | |||
27 | public VersionedMapImpl( | ||
28 | VersionedMapStoreImpl<KEY,VALUE> store, | ||
29 | ContinousHashProvider<? super KEY> hashProvider, | ||
30 | VALUE defaultValue) | ||
31 | { | ||
32 | this.store = store; | ||
33 | this.hashProvider = hashProvider; | ||
34 | this.defaultValue = defaultValue; | ||
35 | this.root = null; | ||
36 | } | ||
37 | public VersionedMapImpl( | ||
38 | VersionedMapStoreImpl<KEY,VALUE> store, | ||
39 | ContinousHashProvider<? super KEY> hashProvider, | ||
40 | VALUE defaultValue, Node<KEY,VALUE> data) | ||
41 | { | ||
42 | this.store = store; | ||
43 | this.hashProvider = hashProvider; | ||
44 | this.defaultValue = defaultValue; | ||
45 | this.root = data; | ||
46 | } | ||
47 | |||
48 | public VALUE getDefaultValue() { | ||
49 | return defaultValue; | ||
50 | } | ||
51 | public ContinousHashProvider<? super KEY> getHashProvider() { | ||
52 | return hashProvider; | ||
53 | } | ||
54 | @Override | ||
55 | public void put(KEY key, VALUE value) { | ||
56 | if(root!=null) { | ||
57 | root = root.putValue(key, value, hashProvider, defaultValue, hashProvider.getHash(key, 0), 0); | ||
58 | } else { | ||
59 | root = MutableNode.initialize(key, value, hashProvider, defaultValue); | ||
60 | } | ||
61 | } | ||
62 | @Override | ||
63 | public VALUE get(KEY key) { | ||
64 | if(root!=null) { | ||
65 | return root.getValue(key, hashProvider, defaultValue, hashProvider.getHash(key, 0), 0); | ||
66 | } else { | ||
67 | return defaultValue; | ||
68 | } | ||
69 | } | ||
70 | @Override | ||
71 | public int getSize() { | ||
72 | if(root == null) { | ||
73 | return 0; | ||
74 | } else { | ||
75 | return root.getSize(); | ||
76 | } | ||
77 | } | ||
78 | @Override | ||
79 | public | ||
80 | Iterator<Map.Entry<KEY,VALUE>> getIterator() { | ||
81 | return new MapEntryIterator<>(this.root); | ||
82 | } | ||
83 | @Override | ||
84 | public Cursor<KEY, VALUE> getCursor() { | ||
85 | return new MapEntryIterator<>(this.root); | ||
86 | } | ||
87 | |||
88 | @Override | ||
89 | public long commit() { | ||
90 | ImmutableNode<KEY,VALUE> immutable; | ||
91 | if(this.root != null) { | ||
92 | immutable = root.toImmutable(); | ||
93 | } else { | ||
94 | immutable = null; | ||
95 | } | ||
96 | long result = this.store.addState(immutable); | ||
97 | return result; | ||
98 | } | ||
99 | |||
100 | @Override | ||
101 | public void restore(long state) { | ||
102 | // TODO Auto-generated method stub | ||
103 | } | ||
104 | |||
105 | public void prettyPrint() { | ||
106 | StringBuilder s = new StringBuilder(); | ||
107 | if(this.root != null) { | ||
108 | this.root.prettyPrint(s, 0, -1); | ||
109 | System.out.println(s.toString()); | ||
110 | } else { | ||
111 | System.out.println("empty tree"); | ||
112 | } | ||
113 | } | ||
114 | } | ||
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapSmokeTest.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapSmokeTest.java index 161f3f1f..8532da63 100644 --- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapSmokeTest.java +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapSmokeTest.java | |||
@@ -4,6 +4,7 @@ import static org.junit.Assert.fail; | |||
4 | 4 | ||
5 | import java.util.Random; | 5 | import java.util.Random; |
6 | 6 | ||
7 | import org.eclipse.viatra.solver.data.map.internal.VersionedMapImpl; | ||
7 | import org.junit.jupiter.api.Test; | 8 | import org.junit.jupiter.api.Test; |
8 | 9 | ||
9 | public class MapSmokeTest { | 10 | public class MapSmokeTest { |
@@ -12,7 +13,8 @@ public class MapSmokeTest { | |||
12 | String[] values = prepareValues(maxValue); | 13 | String[] values = prepareValues(maxValue); |
13 | ContinousHashProvider<Integer> chp = prepareHashProvider(); | 14 | ContinousHashProvider<Integer> chp = prepareHashProvider(); |
14 | 15 | ||
15 | VersionedMap<Integer, String> sut = new VersionedMap<Integer, String>(chp, values[0]); | 16 | VersionedMapStore<Integer, String> store = new VersionedMapStoreImpl<Integer, String>(chp, values[0]); |
17 | VersionedMapImpl<Integer, String> sut = (VersionedMapImpl<Integer, String>) store.createMap(); | ||
16 | MapTestEnvironment<Integer, String> e = new MapTestEnvironment<Integer, String>(sut); | 18 | MapTestEnvironment<Integer, String> e = new MapTestEnvironment<Integer, String>(sut); |
17 | 19 | ||
18 | Random r = new Random(seed); | 20 | Random r = new Random(seed); |
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTestEnvironment.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTestEnvironment.java index 04ae6bd0..507e8dc2 100644 --- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTestEnvironment.java +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/tests/org/eclipse/viatra/solver/data/map/MapTestEnvironment.java | |||
@@ -5,21 +5,22 @@ import static org.junit.Assert.fail; | |||
5 | import java.util.HashMap; | 5 | import java.util.HashMap; |
6 | import java.util.Iterator; | 6 | import java.util.Iterator; |
7 | import java.util.Map; | 7 | import java.util.Map; |
8 | import java.util.TreeMap; | ||
9 | import java.util.Map.Entry; | 8 | import java.util.Map.Entry; |
10 | import java.util.TreeSet; | 9 | import java.util.TreeMap; |
10 | |||
11 | import org.eclipse.viatra.solver.data.map.internal.VersionedMapImpl; | ||
11 | 12 | ||
12 | public class MapTestEnvironment<KEY,VALUE> { | 13 | public class MapTestEnvironment<KEY,VALUE> { |
13 | VersionedMap<KEY, VALUE> sut; | 14 | VersionedMapImpl<KEY, VALUE> sut; |
14 | Map<KEY,VALUE> oracle = new HashMap<KEY, VALUE>(); | 15 | Map<KEY,VALUE> oracle = new HashMap<KEY, VALUE>(); |
15 | 16 | ||
16 | public MapTestEnvironment(VersionedMap<KEY, VALUE> sut) { | 17 | public MapTestEnvironment(VersionedMapImpl<KEY, VALUE> sut) { |
17 | this.sut = sut; | 18 | this.sut = sut; |
18 | } | 19 | } |
19 | 20 | ||
20 | public void put(KEY key, VALUE value) { | 21 | public void put(KEY key, VALUE value) { |
21 | sut.put(key, value); | 22 | sut.put(key, value); |
22 | if(value != sut.defaultValue) { | 23 | if(value != sut.getDefaultValue()) { |
23 | oracle.put(key, value); | 24 | oracle.put(key, value); |
24 | } else { | 25 | } else { |
25 | oracle.remove(key); | 26 | oracle.remove(key); |