diff options
Diffstat (limited to 'Solvers/VIATRA-Solver')
-rw-r--r-- | Solvers/VIATRA-Solver/org.eclipse.viatra.solver.data/src/org/eclipse/viatra/solver/data/map/internal/ImmutableNode.java | 21 |
1 files changed, 13 insertions, 8 deletions
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 539f9d65..229aee74 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 | |||
@@ -48,9 +48,6 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> { | |||
48 | } | 48 | } |
49 | 49 | ||
50 | // 2. otherwise construct a new ImmutableNode | 50 | // 2. otherwise construct a new ImmutableNode |
51 | |||
52 | final int resultHash = node.hashCode(); | ||
53 | |||
54 | int size = 0; | 51 | int size = 0; |
55 | for(int i = 0; i<node.content.length; i++) { | 52 | for(int i = 0; i<node.content.length; i++) { |
56 | if(node.content[i]!=null) { | 53 | if(node.content[i]!=null) { |
@@ -82,8 +79,12 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> { | |||
82 | } | 79 | } |
83 | bitposition<<=1; | 80 | bitposition<<=1; |
84 | } | 81 | } |
82 | final int resultHash = node.hashCode(); | ||
83 | ImmutableNode<KEY,VALUE> newImmutable = new ImmutableNode<>(resultDataMap, resultNodeMap, resultContent, resultHash); | ||
85 | 84 | ||
86 | return new ImmutableNode<>(resultDataMap, resultNodeMap, resultContent, resultHash); | 85 | // 3. save new immutable. |
86 | cache.put(newImmutable, newImmutable); | ||
87 | return newImmutable; | ||
87 | } | 88 | } |
88 | 89 | ||
89 | private int index(int bitmap, int bitpos) { | 90 | private int index(int bitmap, int bitpos) { |
@@ -185,7 +186,8 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> { | |||
185 | public long getSize() { | 186 | public long getSize() { |
186 | int result = Integer.bitCount(this.dataMap); | 187 | int result = Integer.bitCount(this.dataMap); |
187 | for(int subnodeIndex = 0; subnodeIndex < Integer.bitCount(this.nodeMap); subnodeIndex++) { | 188 | for(int subnodeIndex = 0; subnodeIndex < Integer.bitCount(this.nodeMap); subnodeIndex++) { |
188 | ImmutableNode<KEY,VALUE> subnode = (ImmutableNode<KEY, VALUE>) this.content[this.content.length-1-subnodeIndex]; | 189 | ImmutableNode<KEY,VALUE> subnode = |
190 | (ImmutableNode<KEY, VALUE>) this.content[this.content.length-1-subnodeIndex]; | ||
189 | result += subnode.getSize(); | 191 | result += subnode.getSize(); |
190 | } | 192 | } |
191 | return result; | 193 | return result; |
@@ -325,8 +327,10 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> { | |||
325 | int nodes = 0; | 327 | int nodes = 0; |
326 | final int immutableLength = immutable.content.length; | 328 | final int immutableLength = immutable.content.length; |
327 | for(int i = 0; i<factor; i++) { | 329 | for(int i = 0; i<factor; i++) { |
328 | Object key = immutable.content[i*2]; | 330 | Object key = mutable.content[i*2]; |
331 | // For each key candidate | ||
329 | if(key != null) { | 332 | if(key != null) { |
333 | // Check whether a new Key-Value pair can fit into the immutable container | ||
330 | if(datas*2+nodes+2 <= immutableLength) { | 334 | if(datas*2+nodes+2 <= immutableLength) { |
331 | if( mutable.content[datas*2] != key || | 335 | if( mutable.content[datas*2] != key || |
332 | mutable.content[datas*2+1] != immutable.content[i*2+1]) | 336 | mutable.content[datas*2+1] != immutable.content[i*2+1]) |
@@ -339,16 +343,17 @@ public class ImmutableNode<KEY, VALUE> extends Node<KEY, VALUE> { | |||
339 | Node<?,?> mutableSubnode = (Node<?, ?>) mutable.content[i*2+1]; | 343 | Node<?,?> mutableSubnode = (Node<?, ?>) mutable.content[i*2+1]; |
340 | if(mutableSubnode != null) { | 344 | if(mutableSubnode != null) { |
341 | if(datas*2+nodes+1 <= immutableLength) { | 345 | if(datas*2+nodes+1 <= immutableLength) { |
342 | Node<?,?> immutableSubnode = (Node<?, ?>) immutable.content[immutableLength-1-nodes]; | 346 | Object immutableSubnode = immutable.content[immutableLength-1-nodes]; |
343 | if(!mutableSubnode.equals(immutableSubnode)) { | 347 | if(!mutableSubnode.equals(immutableSubnode)) { |
344 | return false; | 348 | return false; |
345 | } | 349 | } |
346 | nodes++; | 350 | nodes++; |
351 | } else { | ||
352 | return false; | ||
347 | } | 353 | } |
348 | } | 354 | } |
349 | } | 355 | } |
350 | } | 356 | } |
351 | return true; | 357 | return true; |
352 | } | 358 | } |
353 | |||
354 | } | 359 | } |