aboutsummaryrefslogtreecommitdiffstats
path: root/Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse
diff options
context:
space:
mode:
authorLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-05 23:08:04 +0200
committerLibravatar Oszkar Semerath <Oszkar Semerath@DESKTOP-DNR7JQ7>2021-07-05 23:08:04 +0200
commit51b544612ff088f6b772eaf2ca9fdd43f56450ec (patch)
tree13428b79589240f567a1a2a10d74894ea973825d /Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse
parentFirst version of Cursor, Iterator and getSize() (diff)
downloadVIATRA-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')
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/VersionedMap.java12
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java6
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapCursor.java15
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MapEntryIterator.java8
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/MutableNode.java37
-rw-r--r--Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/Node.java2
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;
9import org.eclipse.viatra.solver.data.map.internal.Node; 9import org.eclipse.viatra.solver.data.map.internal.Node;
10 10
11public class VersionedMap<KEY,VALUE> implements Versioned{ 11public 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 */
17public class MapEntryIterator<KEY,VALUE> extends MapCursor<KEY, VALUE> implements Iterator<Map.Entry<KEY,VALUE>>{ 17public 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();