diff options
author | Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7> | 2021-07-05 23:08:04 +0200 |
---|---|---|
committer | Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7> | 2021-07-05 23:08:04 +0200 |
commit | 51b544612ff088f6b772eaf2ca9fdd43f56450ec (patch) | |
tree | 13428b79589240f567a1a2a10d74894ea973825d /Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse | |
parent | First version of Cursor, Iterator and getSize() (diff) | |
download | VIATRA-Generator-51b544612ff088f6b772eaf2ca9fdd43f56450ec.tar.gz VIATRA-Generator-51b544612ff088f6b772eaf2ca9fdd43f56450ec.tar.zst VIATRA-Generator-51b544612ff088f6b772eaf2ca9fdd43f56450ec.zip |
iterator fix
Diffstat (limited to 'Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse')
6 files changed, 54 insertions, 26 deletions
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 d5c636d9..4328fde1 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 | |||
@@ -9,10 +9,10 @@ import org.eclipse.viatra.solver.data.map.internal.MutableNode; | |||
9 | import org.eclipse.viatra.solver.data.map.internal.Node; | 9 | import org.eclipse.viatra.solver.data.map.internal.Node; |
10 | 10 | ||
11 | public class VersionedMap<KEY,VALUE> implements Versioned{ | 11 | public class VersionedMap<KEY,VALUE> implements Versioned{ |
12 | |||
13 | protected final ContinousHashProvider<? super KEY> hashProvider; | 12 | protected final ContinousHashProvider<? super KEY> hashProvider; |
14 | protected final VALUE defaultValue; | 13 | protected final VALUE defaultValue; |
15 | protected Node<KEY,VALUE> root = null; | 14 | protected Node<KEY,VALUE> root = null; |
15 | //TODO: protected final iterators | ||
16 | 16 | ||
17 | protected VersionedMap(ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue) { | 17 | protected VersionedMap(ContinousHashProvider<? super KEY> hashProvider, VALUE defaultValue) { |
18 | this.hashProvider = hashProvider; | 18 | this.hashProvider = hashProvider; |
@@ -61,4 +61,14 @@ public class VersionedMap<KEY,VALUE> implements Versioned{ | |||
61 | public void restore(long state) { | 61 | public void restore(long state) { |
62 | // TODO Auto-generated method stub | 62 | // TODO Auto-generated method stub |
63 | } | 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 | } | ||
64 | } | 74 | } |
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 908d335c..70c4daff 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 | |||
@@ -203,8 +203,8 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> { | |||
203 | // 2.1 found next subnode, move down to the subnode | 203 | // 2.1 found next subnode, move down to the subnode |
204 | Node<KEY, VALUE> subnode = (Node<KEY, VALUE>) this.content[this.content.length-1-newNodeIndex]; | 204 | Node<KEY, VALUE> subnode = (Node<KEY, VALUE>) this.content[this.content.length-1-newNodeIndex]; |
205 | cursor.dataIndex = MapCursor.IndexStart; | 205 | cursor.dataIndex = MapCursor.IndexStart; |
206 | cursor.nodeStack.add(subnode); | 206 | cursor.nodeStack.push(subnode); |
207 | cursor.nodeIndexStack.add(newNodeIndex); | 207 | cursor.nodeIndexStack.push(newNodeIndex); |
208 | return subnode.moveToNext(cursor); | 208 | return subnode.moveToNext(cursor); |
209 | } else { | 209 | } else { |
210 | // 3. no subnode found, move up | 210 | // 3. no subnode found, move up |
@@ -222,7 +222,7 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> { | |||
222 | } | 222 | } |
223 | 223 | ||
224 | @Override | 224 | @Override |
225 | protected void prettyPrint(StringBuilder builder, int depth, int code) { | 225 | public void prettyPrint(StringBuilder builder, int depth, int code) { |
226 | for(int i = 0; i<depth; i++) { | 226 | for(int i = 0; i<depth; i++) { |
227 | builder.append("\t"); | 227 | builder.append("\t"); |
228 | } | 228 | } |
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 4a4912d8..40ba55fa 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 | |||
@@ -20,14 +20,19 @@ public class MapCursor<KEY,VALUE> { | |||
20 | // Initializing tree stack | 20 | // Initializing tree stack |
21 | super(); | 21 | super(); |
22 | this.nodeStack = new Stack<>(); | 22 | this.nodeStack = new Stack<>(); |
23 | this.nodeStack.add(root); | 23 | if(root != null) { |
24 | this.nodeStack.add(root); | ||
25 | } | ||
24 | this.nodeIndexStack = new Stack<>(); | 26 | this.nodeIndexStack = new Stack<>(); |
25 | this.nodeIndexStack.add(IndexStart); | 27 | this.nodeIndexStack.push(IndexStart); |
26 | this.dataIndex = IndexStart; | 28 | this.dataIndex = IndexStart; |
27 | 29 | ||
28 | // Initializing cache | 30 | // Initializing cache |
29 | this.key = null; | 31 | this.key = null; |
30 | this.value = null; | 32 | this.value = null; |
33 | |||
34 | // move to first | ||
35 | move(); | ||
31 | } | 36 | } |
32 | 37 | ||
33 | public KEY getKey() { | 38 | public KEY getKey() { |
@@ -43,10 +48,10 @@ public class MapCursor<KEY,VALUE> { | |||
43 | } | 48 | } |
44 | 49 | ||
45 | public boolean move() { | 50 | public boolean move() { |
46 | if(this.isTerminated()) { | 51 | if(!isTerminated()) { |
47 | return false; | 52 | return this.nodeStack.peek().moveToNext(this); |
48 | } else { | 53 | } else { |
49 | return true; | 54 | return false; |
50 | } | 55 | } |
51 | } | 56 | } |
52 | } | 57 | } |
diff --git a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java index 82983484..47976b46 100644 --- a/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java +++ b/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java | |||
@@ -16,20 +16,20 @@ import java.util.NoSuchElementException; | |||
16 | */ | 16 | */ |
17 | public class MapEntryIterator<KEY,VALUE> extends MapCursor<KEY, VALUE> implements Iterator<Map.Entry<KEY,VALUE>>{ | 17 | public class MapEntryIterator<KEY,VALUE> extends MapCursor<KEY, VALUE> implements Iterator<Map.Entry<KEY,VALUE>>{ |
18 | 18 | ||
19 | |||
19 | public MapEntryIterator(Node<KEY, VALUE> root) { | 20 | public MapEntryIterator(Node<KEY, VALUE> root) { |
20 | super(root); | 21 | super(root); |
21 | // move to first | 22 | |
22 | move(); | ||
23 | } | 23 | } |
24 | 24 | ||
25 | @Override | 25 | @Override |
26 | public boolean hasNext() { | 26 | public boolean hasNext() { |
27 | return this.isTerminated(); | 27 | return !this.isTerminated(); |
28 | } | 28 | } |
29 | 29 | ||
30 | @Override | 30 | @Override |
31 | public Entry<KEY, VALUE> next() { | 31 | public Entry<KEY, VALUE> next() { |
32 | if(!this.hasNext()) { | 32 | if(this.hasNext()) { |
33 | Map.Entry<KEY, VALUE> result = new AbstractMap.SimpleEntry<KEY, VALUE>(this.key, this.value); | 33 | Map.Entry<KEY, VALUE> result = new AbstractMap.SimpleEntry<KEY, VALUE>(this.key, this.value); |
34 | this.move(); | 34 | this.move(); |
35 | return result; | 35 | return result; |
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 9b30dbb7..4c764f2b 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 | |||
@@ -112,7 +112,8 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { | |||
112 | if(value == defaultValue) { | 112 | if(value == defaultValue) { |
113 | return removeEntry(selectedHashFragment); | 113 | return removeEntry(selectedHashFragment); |
114 | } else { | 114 | } else { |
115 | return updateValue(value, selectedHashFragment); | 115 | content[2*selectedHashFragment+1] = value; |
116 | return this; | ||
116 | } | 117 | } |
117 | } else { | 118 | } else { |
118 | if(value == defaultValue) { | 119 | if(value == defaultValue) { |
@@ -129,12 +130,24 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { | |||
129 | Node<KEY, VALUE> newNode = nodeCandidate.putValue(key, value, hashProvider, defaultValue, newHash(hashProvider, key, hash, depth+1), depth+1); | 130 | Node<KEY, VALUE> newNode = nodeCandidate.putValue(key, value, hashProvider, defaultValue, newHash(hashProvider, key, hash, depth+1), depth+1); |
130 | return updateSubNode(selectedHashFragment,newNode); | 131 | return updateSubNode(selectedHashFragment,newNode); |
131 | } else { | 132 | } else { |
132 | content[2*selectedHashFragment] = key; | 133 | if(value == defaultValue) { |
133 | return updateValue(value, selectedHashFragment); | 134 | // dont need to add new key-value pair |
135 | return this; | ||
136 | } else { | ||
137 | content[2*selectedHashFragment] = key; | ||
138 | content[2*selectedHashFragment+1] = value; | ||
139 | return this; | ||
140 | } | ||
141 | |||
134 | } | 142 | } |
135 | } | 143 | } |
136 | } | 144 | } |
137 | 145 | ||
146 | Node<KEY, VALUE> updateValue(VALUE value, int selectedHashFragment) { | ||
147 | content[2*selectedHashFragment+1] = value; | ||
148 | return this; | ||
149 | } | ||
150 | |||
138 | Node<KEY, VALUE> updateSubNode(int selectedHashFragment, Node<KEY, VALUE> newNode) { | 151 | Node<KEY, VALUE> updateSubNode(int selectedHashFragment, Node<KEY, VALUE> newNode) { |
139 | content[2*selectedHashFragment+1] = newNode; | 152 | content[2*selectedHashFragment+1] = newNode; |
140 | for(int i = 0; i<this.content.length; i++) { | 153 | for(int i = 0; i<this.content.length; i++) { |
@@ -162,10 +175,6 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { | |||
162 | return this; | 175 | return this; |
163 | } | 176 | } |
164 | 177 | ||
165 | Node<KEY, VALUE> updateValue(VALUE value, int selectedHashFragment) { | ||
166 | content[2*selectedHashFragment+1] = value; | ||
167 | return this; | ||
168 | } | ||
169 | Node<KEY, VALUE> removeEntry(int selectedHashFragment) { | 178 | Node<KEY, VALUE> removeEntry(int selectedHashFragment) { |
170 | content[2*selectedHashFragment] = null; | 179 | content[2*selectedHashFragment] = null; |
171 | content[2*selectedHashFragment+1] = null; | 180 | content[2*selectedHashFragment+1] = null; |
@@ -217,8 +226,9 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { | |||
217 | return true; | 226 | return true; |
218 | } | 227 | } |
219 | } | 228 | } |
229 | cursor.dataIndex = MapCursor.IndexFinish; | ||
220 | } | 230 | } |
221 | cursor.dataIndex = MapCursor.IndexFinish; | 231 | |
222 | // 2. look inside the subnodes | 232 | // 2. look inside the subnodes |
223 | for(int index = cursor.nodeIndexStack.peek()+1; index < factor; index++) { | 233 | for(int index = cursor.nodeIndexStack.peek()+1; index < factor; index++) { |
224 | if(this.content[index*2]==null && this.content[index*2+1] !=null) { | 234 | if(this.content[index*2]==null && this.content[index*2+1] !=null) { |
@@ -226,8 +236,9 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { | |||
226 | 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]; |
227 | 237 | ||
228 | cursor.dataIndex = MapCursor.IndexStart; | 238 | cursor.dataIndex = MapCursor.IndexStart; |
229 | cursor.nodeStack.add(subnode); | 239 | cursor.nodeIndexStack.set(0,index); |
230 | cursor.nodeIndexStack.add(index); | 240 | cursor.nodeStack.push(subnode); |
241 | cursor.nodeIndexStack.push(MapCursor.IndexStart); | ||
231 | 242 | ||
232 | return subnode.moveToNext(cursor); | 243 | return subnode.moveToNext(cursor); |
233 | } | 244 | } |
@@ -246,7 +257,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { | |||
246 | } | 257 | } |
247 | 258 | ||
248 | @Override | 259 | @Override |
249 | protected void prettyPrint(StringBuilder builder, int depth, int code) { | 260 | public void prettyPrint(StringBuilder builder, int depth, int code) { |
250 | for(int i = 0; i<depth; i++) { | 261 | for(int i = 0; i<depth; i++) { |
251 | builder.append("\t"); | 262 | builder.append("\t"); |
252 | } | 263 | } |
@@ -255,6 +266,7 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { | |||
255 | builder.append(":"); | 266 | builder.append(":"); |
256 | } | 267 | } |
257 | builder.append("Mutable("); | 268 | builder.append("Mutable("); |
269 | // print content | ||
258 | boolean hadContent = false; | 270 | boolean hadContent = false; |
259 | for(int i = 0; i<factor; i++) { | 271 | for(int i = 0; i<factor; i++) { |
260 | if(content[2*i] != null) { | 272 | if(content[2*i] != null) { |
@@ -271,8 +283,9 @@ public class MutableNode<KEY,VALUE> extends Node<KEY,VALUE> { | |||
271 | } | 283 | } |
272 | } | 284 | } |
273 | builder.append(")"); | 285 | builder.append(")"); |
286 | // print subnodes | ||
274 | for(int i = 0; i<factor; i++) { | 287 | for(int i = 0; i<factor; i++) { |
275 | if(content[2*i] == null || content[2*i+1]!=null) { | 288 | if(content[2*i] == null && content[2*i+1]!=null) { |
276 | @SuppressWarnings("unchecked") | 289 | @SuppressWarnings("unchecked") |
277 | Node<KEY,VALUE> subNode = (Node<KEY, VALUE>) content[2*i+1]; | 290 | Node<KEY,VALUE> subNode = (Node<KEY, VALUE>) content[2*i+1]; |
278 | builder.append("\n"); | 291 | builder.append("\n"); |
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 7a6599a2..9b01cfcf 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 | |||
@@ -66,7 +66,7 @@ public abstract class Node<KEY,VALUE>{ | |||
66 | //abstract boolean moveIteratorToNextData(NodeIterator<KEY,VALUE> iterator, int currentIndex); | 66 | //abstract boolean moveIteratorToNextData(NodeIterator<KEY,VALUE> iterator, int currentIndex); |
67 | //abstract boolean moveIteratorToNextNode(NodeIterator<KEY,VALUE> iterator, int currentIndex); | 67 | //abstract boolean moveIteratorToNextNode(NodeIterator<KEY,VALUE> iterator, int currentIndex); |
68 | ///////// FOR printing | 68 | ///////// FOR printing |
69 | abstract protected void prettyPrint(StringBuilder builder, int depth, int code); | 69 | abstract public void prettyPrint(StringBuilder builder, int depth, int code); |
70 | @Override | 70 | @Override |
71 | public String toString() { | 71 | public String toString() { |
72 | StringBuilder stringBuilder = new StringBuilder(); | 72 | StringBuilder stringBuilder = new StringBuilder(); |