1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.giraph.edge;
20
21 import org.apache.giraph.graph.Vertex;
22 import org.apache.hadoop.io.Writable;
23 import org.apache.hadoop.io.WritableComparable;
24
25 import java.util.Iterator;
26
27
28
29
30
31
32
33
34 public class MutableEdgesIterable<I extends WritableComparable,
35 E extends Writable> implements Iterable<MutableEdge<I, E>> {
36
37 private Vertex<I, ?, E> vertex;
38
39
40
41
42
43
44 public MutableEdgesIterable(Vertex<I, ?, E> vertex) {
45 this.vertex = vertex;
46 }
47
48 @Override
49 public Iterator<MutableEdge<I, E>> iterator() {
50 final MutableEdgesWrapper<I, E> mutableEdgesWrapper =
51 MutableEdgesWrapper.wrap((OutEdges<I, E>) vertex.getEdges(),
52 vertex.getConf());
53 vertex.setEdges(mutableEdgesWrapper);
54
55 return new Iterator<MutableEdge<I, E>>() {
56
57 private Iterator<Edge<I, E>> oldEdgesIterator =
58 mutableEdgesWrapper.getOldEdgesIterator();
59
60 private OutEdges<I, E> newEdges = mutableEdgesWrapper.getNewEdges();
61
62 @Override
63 public boolean hasNext() {
64
65
66 Edge<I, E> currentEdge = mutableEdgesWrapper.getCurrentEdge();
67 if (currentEdge != null) {
68 newEdges.add(currentEdge);
69 mutableEdgesWrapper.setCurrentEdge(null);
70 }
71 if (!oldEdgesIterator.hasNext()) {
72 vertex.setEdges(newEdges);
73 return false;
74 } else {
75 return true;
76 }
77 }
78
79 @Override
80 public MutableEdge<I, E> next() {
81
82
83 MutableEdge<I, E> currentEdge =
84 mutableEdgesWrapper.getCurrentEdge();
85 if (currentEdge != null) {
86 newEdges.add(currentEdge);
87 }
88
89 currentEdge = (MutableEdge<I, E>) oldEdgesIterator.next();
90 mutableEdgesWrapper.setCurrentEdge(currentEdge);
91 return currentEdge;
92 }
93
94 @Override
95 public void remove() {
96
97
98 mutableEdgesWrapper.setCurrentEdge(null);
99 mutableEdgesWrapper.decrementEdges();
100 }
101 };
102 }
103 }