Ticket #8643: purgemod2.diff
| File purgemod2.diff, 2.4 KB (added by , 13 years ago) |
|---|
-
src/org/openstreetmap/josm/command/PurgeCommand.java
132 132 133 133 List<OsmPrimitive> out = new ArrayList<OsmPrimitive>(in.size()); 134 134 135 // Nodes not deleted in the first pass 136 Set<OsmPrimitive> remainingNodes = new HashSet<OsmPrimitive>(in.size()); 137 135 138 /** 136 139 * First add nodes that have no way referrer. 137 140 */ … … 142 145 Node n = (Node) u; 143 146 for (OsmPrimitive ref : n.getReferrers()) { 144 147 if (ref instanceof Way && in.contains(ref)) { 148 it.remove(); 149 remainingNodes.add(n); 145 150 continue outer; 146 151 } 147 152 } … … 153 158 /** 154 159 * Then add all ways, each preceded by its (remaining) nodes. 155 160 */ 156 top: while (!in.isEmpty()) { 157 for (Iterator<OsmPrimitive> it = in.iterator(); it.hasNext();) { 158 OsmPrimitive u = it.next(); 159 if (u instanceof Way) { 160 Way w = (Way) u; 161 it.remove(); 162 for (Node n : w.getNodes()) { 163 if (in.contains(n)) { 164 in.remove(n); 165 out.add(n); 166 } 161 for (Iterator<OsmPrimitive> it = in.iterator(); it.hasNext();) { 162 OsmPrimitive u = it.next(); 163 if (u instanceof Way) { 164 Way w = (Way) u; 165 it.remove(); 166 for (Node n : w.getNodes()) { 167 if (remainingNodes.contains(n)) { 168 remainingNodes.remove(n); 169 out.add(n); 167 170 } 168 out.add(w);169 continue top;170 171 } 172 out.add(w); 171 173 } 172 break; // no more ways left173 174 } 174 175 176 if (!remainingNodes.isEmpty()) 177 throw new AssertionError("topo sort algorithm failed (nodes remaining)"); 178 175 179 /** 176 180 * Rest are relations. Do topological sorting on a DAG where each 177 181 * arrow points from child to parent. (Because it is faster to
