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