NodeList.java revision c77e046d2a645bf42f9450bd293e0ba69300a309
1515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenpackage com.github.javaparser.ast; 2515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 3db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggenimport com.github.javaparser.HasParentNode; 4263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassettiimport com.github.javaparser.ast.observing.AstObserver; 56d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassettiimport com.github.javaparser.ast.observing.ListChangeType; 6c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettiimport com.github.javaparser.ast.observing.Observable; 7515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenimport com.github.javaparser.ast.visitor.GenericVisitor; 8008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilienimport com.github.javaparser.ast.visitor.Visitable; 9515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggenimport com.github.javaparser.ast.visitor.VoidVisitor; 10515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 116d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassettiimport java.util.*; 12c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettiimport java.util.function.Consumer; 13c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettiimport java.util.function.Predicate; 14c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettiimport java.util.function.UnaryOperator; 156d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassettiimport java.util.stream.Stream; 166d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 17515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen/** 18db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen * A list of nodes. 19515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen * 20515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen * @param <N> the type of nodes contained. 21515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen */ 22c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassettipublic class NodeList<N extends Node> implements List<N>, Iterable<N>, HasParentNode<NodeList<N>>, Visitable, Observable { 23515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen private List<N> innerList = new ArrayList<>(0); 24515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 25db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen private Node parentNode; 26db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 27263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti private List<AstObserver> observers = new ArrayList<>(); 286d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 29515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public NodeList() { 30db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen this(null); 31515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 32515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 33515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public NodeList(Node parent) { 34515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setParentNode(parent); 35515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 36515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 37f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 38f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean add(N node) { 396d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti notifyElementAdded(innerList.size(), node); 40515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen own(node); 41f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.add(node); 42515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 43515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 44515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen private void own(N node) { 45515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen if (node == null) { 46515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return; 47515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 48515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setAsParentNodeOf(node); 49515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 50515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 51515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean remove(Node node) { 526d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti notifyElementRemoved(innerList.indexOf(node), node); 53515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen boolean remove = innerList.remove(node); 54515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen node.setParentNode(null); 55515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return remove; 56515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 57515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 58515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(X... nodes) { 59515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 60515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen for (X node : nodes) { 61515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen nodeList.add(node); 62515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 63515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 64515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 65515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 66515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(Collection<X> nodes) { 67515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 68515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen for (X node : nodes) { 69515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen nodeList.add(node); 70515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 71515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 72515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 73515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 74515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public static <X extends Node> NodeList<X> nodeList(NodeList<X> nodes) { 75515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen final NodeList<X> nodeList = new NodeList<>(); 76515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen for (X node : nodes) { 77515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen nodeList.add(node); 78515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 79515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return nodeList; 80515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 81515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 82515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean contains(N node) { 83515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.contains(node); 84515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 85515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 86f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 87515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public Stream<N> stream() { 88515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.stream(); 89515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 90515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 91f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 92515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public int size() { 93515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.size(); 94515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 95515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 96f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 97515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public N get(int i) { 98515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.get(i); 99515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 100515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 101515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen @Override 102515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public Iterator<N> iterator() { 103515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen // TODO take care of "Iterator.remove" 104515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.iterator(); 105515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 106515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 107f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 108f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public N set(int index, N element) { 109515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen setAsParentNodeOf(element); 110f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.set(index, element); 111515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 112515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 113f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 114f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public N remove(int index) { 115263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti notifyElementRemoved(index, innerList.get(index)); 116f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien N remove = innerList.remove(index); 117f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien if (remove != null) 118f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien remove.setParentNode(null); 119f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return remove; 120515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 121515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 122f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 123515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public boolean isEmpty() { 124515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen return innerList.isEmpty(); 125515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 126515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 127f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 128515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public void sort(Comparator<? super N> comparator) { 129515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen Collections.sort(innerList, comparator); 130515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 131515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 132515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen public void addAll(NodeList<N> otherList) { 133515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen for (N node : otherList) { 134515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen add(node); 135515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 136515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 137515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen 138f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 139f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void add(int index, N node) { 1406d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti notifyElementAdded(index, node); 141515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen own(node); 142515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen innerList.add(index, node); 143515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen } 144db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 145db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 146008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien public Optional<Node> getParentNode() { 147008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien return Optional.ofNullable(parentNode); 148db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 149db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 150008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien /** 151008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * Sets the parentNode 152008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * 153008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * @param parentNode the parentNode 154008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien * @return this, the NodeList 155008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien */ 156db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 157db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public NodeList<N> setParentNode(Node parentNode) { 158db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen this.parentNode = parentNode; 159db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen setAsParentNodeOf(innerList); 160db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return this; 161db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 162db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 163db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen @Override 164db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public Node getParentNodeForChildren() { 165db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return parentNode; 166db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 167db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 168008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien @Override 169db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) { 170db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen return v.visit(this, arg); 171db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 172db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 173008b82d149685d6702a060fbecafc8fc2e10b459Cruz Maximilien @Override 174db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen public <A> void accept(final VoidVisitor<A> v, final A arg) { 175db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen v.visit(this, arg); 176db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen } 177db52836b6a33c9ff130d8ea554f78b21ebe9b586Danny van Bruggen 178f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 179f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param action 180f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.lang.Iterable#forEach(java.util.function.Consumer) 181f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 182f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 183f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void forEach(Consumer<? super N> action) { 184f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien innerList.forEach(action); 185f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 186f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 187f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 188f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param o 189f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 190f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#contains(java.lang.Object) 191f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 192f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 193f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean contains(Object o) { 194f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.contains(o); 195f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 196f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 197f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 198f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 199f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#toArray() 200f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 201f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 202f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Object[] toArray() { 203f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.toArray(); 204f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 205f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 206f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 207f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param a 208f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 209f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#toArray(java.lang.Object[]) 210f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 211f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 212f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public <T> T[] toArray(T[] a) { 213f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.toArray(a); 214f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 215f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 216f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 217f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param o 218f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 219f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#remove(java.lang.Object) 220f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 221f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 222f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean remove(Object o) { 223f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien boolean remove = innerList.remove(o); 224f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien if (o != null && o instanceof Node) 225f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien ((Node) o).setParentNode(null); 226f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return remove; 227f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 228f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 229f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 230f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param c 231f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 232f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#containsAll(java.util.Collection) 233f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 234f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 235f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean containsAll(Collection<?> c) { 236f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.containsAll(c); 237f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 238f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 239f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 240f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param c 241f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 242f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#addAll(java.util.Collection) 243f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 244f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 245f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean addAll(Collection<? extends N> c) { 246f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien for (N n : c) 247f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien own(n); 248f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.addAll(c); 249f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 250f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 251f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 252f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param index 253f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param c 254f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 255f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#addAll(int, java.util.Collection) 256f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 257f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 258f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean addAll(int index, Collection<? extends N> c) { 259f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien for (N n : c) 260f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien own(n); 261f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.addAll(index, c); 262f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 263f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 264f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 265f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param c 266f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 267f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#removeAll(java.util.Collection) 268f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 269f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 270f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean removeAll(Collection<?> c) { 271f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien boolean removeAll = innerList.removeAll(c); 272f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien for (Object o : c) { 273f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien if (o != null && o instanceof Node) 274f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien ((Node) o).setParentNode(null); 275f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 276f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return removeAll; 277f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 278f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 279f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 280f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param c 281f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 282f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#retainAll(java.util.Collection) 283f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 284f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 285f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean retainAll(Collection<?> c) { 286f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.retainAll(c); 287f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 288f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 289f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 290f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param operator 291f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#replaceAll(java.util.function.UnaryOperator) 292f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 293f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 294f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void replaceAll(UnaryOperator<N> operator) { 295f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien innerList.replaceAll(operator); 296f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 297f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 298f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 299f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param filter 300f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 301f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.Collection#removeIf(java.util.function.Predicate) 302f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 303f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 304f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean removeIf(Predicate<? super N> filter) { 305f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien innerList.stream().filter(filter).forEach(n -> { 306f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien if (n != null) 307f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien n.setParentNode(null); 308f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien }); 309f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.removeIf(filter); 310f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 311f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 312f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 313f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * 314f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#clear() 315f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 316f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 317f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public void clear() { 318f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien for (Node n : innerList) 319f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien n.setParentNode(null); 320f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien innerList.clear(); 321f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 322f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 323f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 324f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param o 325f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 326f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#equals(java.lang.Object) 327f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 328f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 329f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public boolean equals(Object o) { 330f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.equals(o); 331f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 332f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 333f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 334f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 335f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#hashCode() 336f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 337f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 338f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int hashCode() { 339f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.hashCode(); 340f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 341f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 342f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 343f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param o 344f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 345f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#indexOf(java.lang.Object) 346f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 347f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 348f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int indexOf(Object o) { 349f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.indexOf(o); 350f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 351f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 352f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 353f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param o 354f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 355f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#lastIndexOf(java.lang.Object) 356f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 357f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 358f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public int lastIndexOf(Object o) { 359f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.lastIndexOf(o); 360f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 361f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 362f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 363f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 364f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#listIterator() 365f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 366f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 367f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public ListIterator<N> listIterator() { 368f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.listIterator(); 369f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 370f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 371f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 372f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param index 373f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 374f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#listIterator(int) 375f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 376f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 377f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public ListIterator<N> listIterator(int index) { 378f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.listIterator(index); 379f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 380f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 381f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 382f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 383f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.Collection#parallelStream() 384f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 385f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 386f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Stream<N> parallelStream() { 387f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.parallelStream(); 388f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 389f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 390f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 391f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param fromIndex 392f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @param toIndex 393f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 394f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#subList(int, int) 395f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 396f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 397f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public List<N> subList(int fromIndex, int toIndex) { 398f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.subList(fromIndex, toIndex); 399f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 400f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 401f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien /** 402f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @return 403f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien * @see java.util.List#spliterator() 404f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien */ 405f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien @Override 406f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien public Spliterator<N> spliterator() { 407f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien return innerList.spliterator(); 408c77e046d2a645bf42f9450bd293e0ba69300a309Federico Tomassetti } 409263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti 4106d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti private void notifyElementAdded(int index, Node nodeAddedOrRemoved) { 4116d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti this.observers.forEach(o -> o.listChange(this, ListChangeType.ADDITION, index, nodeAddedOrRemoved)); 4126d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4136d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4146d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti private void notifyElementRemoved(int index, Node nodeAddedOrRemoved) { 4156d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti this.observers.forEach(o -> o.listChange(this, ListChangeType.REMOVAL, index, nodeAddedOrRemoved)); 4166d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4176d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4186d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti @Override 419263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public void unregister(AstObserver observer) { 4206d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti this.observers.remove(observer); 4216d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti } 4226d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti 4236d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti @Override 424263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public void register(AstObserver observer) { 4256d41743d2b5dcd565b401a27f62526ec7a7b54d4Federico Tomassetti this.observers.add(observer); 426263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti } 427263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti 428263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti @Override 429263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti public boolean isRegistered(AstObserver observer) { 430263cf50ac27714b8e120565f45a1fac661df18b5Federico Tomassetti return this.observers.contains(observer); 431f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien } 432f1cce0ac20c5af34085d891bee6d9ff9012d36c7Cruz Maximilien 433515a9392928c14a60dc9dfa42a98198a4d877534Danny van Bruggen} 434