Skip to content

Commit 83d98b5

Browse files
committed
Fix broken size cacheing in Mask*Set
1 parent 0571c8e commit 83d98b5

File tree

4 files changed

+138
-46
lines changed

4 files changed

+138
-46
lines changed

jgrapht-core/src/main/java/org/jgrapht/graph/MaskEdgeSet.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,6 @@ class MaskEdgeSet<V, E>
5959

6060
private transient TypeUtil<E> edgeTypeDecl = null;
6161

62-
private int size;
63-
6462
public MaskEdgeSet(
6563
Graph<V, E> graph,
6664
Set<E> edgeSet,
@@ -69,7 +67,6 @@ public MaskEdgeSet(
6967
this.graph = graph;
7068
this.edgeSet = edgeSet;
7169
this.mask = mask;
72-
this.size = -1;
7370
}
7471

7572
/**
@@ -102,14 +99,7 @@ public MaskEdgeSet(
10299
*/
103100
@Override public int size()
104101
{
105-
if (this.size == -1) {
106-
this.size = 0;
107-
for (Iterator<E> iter = iterator(); iter.hasNext();) {
108-
iter.next();
109-
this.size++;
110-
}
111-
}
112-
return this.size;
102+
return (int) edgeSet.stream().filter(e -> contains(e)).count();
113103
}
114104

115105
private class MaskEdgeSetNextElementFunctor

jgrapht-core/src/main/java/org/jgrapht/graph/MaskVertexSet.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ class MaskVertexSet<V, E>
5252
{
5353
private MaskFunctor<V, E> mask;
5454

55-
private int size;
56-
5755
private Set<V> vertexSet;
5856

5957
private transient TypeUtil<V> vertexTypeDecl = null;
@@ -62,17 +60,21 @@ public MaskVertexSet(Set<V> vertexSet, MaskFunctor<V, E> mask)
6260
{
6361
this.vertexSet = vertexSet;
6462
this.mask = mask;
65-
this.size = -1;
6663
}
6764

6865
/**
6966
* @see java.util.Collection#contains(java.lang.Object)
7067
*/
7168
@Override public boolean contains(Object o)
7269
{
73-
return
74-
!this.mask.isVertexMasked(TypeUtil.uncheckedCast(o, vertexTypeDecl))
75-
&& this.vertexSet.contains(o);
70+
// Type system shenanigans to check whether o is a vertex
71+
try {
72+
V v = (V) o;
73+
return vertexSet.contains(v)
74+
&& !mask.isVertexMasked(v);
75+
} catch (ClassCastException e) {
76+
return false;
77+
}
7678
}
7779

7880
/**
@@ -88,14 +90,7 @@ public MaskVertexSet(Set<V> vertexSet, MaskFunctor<V, E> mask)
8890
*/
8991
@Override public int size()
9092
{
91-
if (this.size == -1) {
92-
this.size = 0;
93-
for (Iterator<V> iter = iterator(); iter.hasNext();) {
94-
iter.next();
95-
this.size++;
96-
}
97-
}
98-
return this.size;
93+
return (int) vertexSet.stream().filter(v -> contains(v)).count();
9994
}
10095

10196
private class MaskVertexSetNextElementFunctor

jgrapht-core/src/test/java/org/jgrapht/graph/MaskEdgeSetTest.java

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
* the Eclipse Foundation.
2121
*/
2222
/* --------------------------
23-
* AsUndirectedGraphTest.java
23+
* MaxEdgeSetTest.java
2424
* --------------------------
2525
* (C) Copyright 2016-, by Andrew Gainer-Dewar and Contributors.
2626
*
@@ -54,24 +54,11 @@ public class MaskEdgeSetTest
5454
private String v4 = "v4";
5555
private DefaultEdge e1, e2, e3, loop1, loop2;
5656

57-
private MaskEdgeSet<String, DefaultEdge> vertexMaskedEdgeSet;
58-
59-
// Functor that masks vertex v1 and no edges
60-
MaskFunctor<String, DefaultEdge> vertexMaskingFunctor = new MaskFunctor<String, DefaultEdge> () {
61-
@Override
62-
public boolean isEdgeMasked (DefaultEdge edge) {
63-
return false;
64-
}
65-
66-
@Override
67-
public boolean isVertexMasked (String vertex) {
68-
return (vertex == v1);
69-
}
70-
};
57+
private MaskEdgeSet<String, DefaultEdge> testMaskedEdgeSet;
7158

7259
@Override
7360
protected void setUp () {
74-
directed =
61+
DirectedGraph<String, DefaultEdge> directed =
7562
new DefaultDirectedGraph<String, DefaultEdge>(
7663
DefaultEdge.class);
7764

@@ -87,15 +74,33 @@ protected void setUp () {
8774
loop1 = directed.addEdge(v1, v1);
8875
loop2 = directed.addEdge(v4, v4);
8976

90-
vertexMaskedEdgeSet = new MaskEdgeSet<>(directed, directed.edgeSet(), vertexMaskingFunctor);
77+
// Functor that masks vertex v1 and and the edge v2-v3
78+
MaskFunctor<String, DefaultEdge> mask = new MaskFunctor<String, DefaultEdge> () {
79+
@Override
80+
public boolean isEdgeMasked (DefaultEdge edge) {
81+
return (edge == e2);
82+
}
83+
84+
@Override
85+
public boolean isVertexMasked (String vertex) {
86+
return (vertex == v1);
87+
}
88+
};
89+
90+
testMaskedEdgeSet = new MaskEdgeSet<>(directed, directed.edgeSet(), mask);
9191
}
9292

9393
// TESTS
9494
public void testContains () {
95-
assertFalse(vertexMaskedEdgeSet.contains(e1));
96-
assertTrue(vertexMaskedEdgeSet.contains(e2));
95+
assertFalse(testMaskedEdgeSet.contains(e1));
96+
assertFalse(testMaskedEdgeSet.contains(e2));
97+
assertTrue(testMaskedEdgeSet.contains(e3));
98+
99+
assertFalse(testMaskedEdgeSet.contains(loop1));
100+
assertTrue(testMaskedEdgeSet.contains(loop2));
101+
}
97102

98-
assertFalse(vertexMaskedEdgeSet.contains(loop1));
99-
assertTrue(vertexMaskedEdgeSet.contains(loop2));
103+
public void testSize () {
104+
assertEquals(2, testMaskedEdgeSet.size());
100105
}
101106
}
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
/* ==========================================
2+
* JGraphT : a free Java graph-theory library
3+
* ==========================================
4+
*
5+
* Project Info: http://jgrapht.sourceforge.net/
6+
* Project Creator: Barak Naveh (http://sourceforge.net/users/barak_naveh)
7+
*
8+
* (C) Copyright 2003-2008, by Barak Naveh and Contributors.
9+
*
10+
* This program and the accompanying materials are dual-licensed under
11+
* either
12+
*
13+
* (a) the terms of the GNU Lesser General Public License version 2.1
14+
* as published by the Free Software Foundation, or (at your option) any
15+
* later version.
16+
*
17+
* or (per the licensee's choosing)
18+
*
19+
* (b) the terms of the Eclipse Public License v1.0 as published by
20+
* the Eclipse Foundation.
21+
*/
22+
/* --------------------------
23+
* MaskVertexSetTest.java
24+
* --------------------------
25+
* (C) Copyright 2016-, by Andrew Gainer-Dewar and Contributors.
26+
*
27+
* Original Author: Andrew Gainer-Dewar, Ph.D>
28+
* Contributor(s): -
29+
*
30+
* Changes
31+
* -------
32+
* April-2016: Initial version;
33+
*
34+
*/
35+
package org.jgrapht.graph;
36+
37+
import java.util.*;
38+
39+
import org.jgrapht.*;
40+
41+
42+
/**
43+
* Unit tests for MaskVertexSet.
44+
*
45+
* @author Andrew Gainer-Dewar
46+
*/
47+
public class MaskVertexSetTest
48+
extends EnhancedTestCase
49+
{
50+
private DirectedGraph<String, DefaultEdge> directed;
51+
private String v1 = "v1";
52+
private String v2 = "v2";
53+
private String v3 = "v3";
54+
private String v4 = "v4";
55+
private DefaultEdge e1, e2, e3, loop1, loop2;
56+
57+
private MaskVertexSet<String, DefaultEdge> testMaskVertexSet;
58+
59+
@Override
60+
protected void setUp () {
61+
directed =
62+
new DefaultDirectedGraph<String, DefaultEdge>(
63+
DefaultEdge.class);
64+
65+
directed.addVertex(v1);
66+
directed.addVertex(v2);
67+
directed.addVertex(v3);
68+
directed.addVertex(v4);
69+
70+
e1 = directed.addEdge(v1, v2);
71+
e2 = directed.addEdge(v2, v3);
72+
e3 = directed.addEdge(v2, v4);
73+
74+
loop1 = directed.addEdge(v1, v1);
75+
loop2 = directed.addEdge(v4, v4);
76+
77+
// Functor that masks vertex v1 and and the edge v2-v3
78+
MaskFunctor<String, DefaultEdge> mask = new MaskFunctor<String, DefaultEdge> () {
79+
@Override
80+
public boolean isEdgeMasked (DefaultEdge edge) {
81+
return (edge == e2);
82+
}
83+
84+
@Override
85+
public boolean isVertexMasked (String vertex) {
86+
return (vertex == v1);
87+
}
88+
};
89+
90+
testMaskVertexSet = new MaskVertexSet<>(directed.vertexSet(), mask);
91+
}
92+
93+
// TESTS
94+
public void testContains () {
95+
assertFalse(testMaskVertexSet.contains(v1));
96+
assertTrue(testMaskVertexSet.contains(v2));
97+
}
98+
99+
public void testSize () {
100+
assertEquals(3, testMaskVertexSet.size());
101+
}
102+
}

0 commit comments

Comments
 (0)