create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / util / MonitorableSet.java
1 package net.sf.openrocket.util;
2
3 import java.util.Collection;
4 import java.util.HashSet;
5 import java.util.Iterator;
6
7 /**
8  * A Set that additionally implements the Monitorable interface.
9  * 
10  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
11  */
12 public class MonitorableSet<E> extends HashSet<E> implements Monitorable {
13
14         private int modID;
15         
16         @Override
17         public boolean add(E e) {
18                 modID++;
19                 return super.add(e);
20         };
21         
22         @Override
23         public boolean addAll(Collection<? extends E> c) {
24                 modID++;
25                 return super.addAll(c);
26         }
27         
28         @Override
29         public void clear() {
30                 modID++;
31                 super.clear();
32         }
33         
34         @Override
35         public Iterator<E> iterator() {
36                 return new MonitorableIterator<E>(super.iterator());
37         }
38         
39         @Override
40         public boolean remove(Object o) {
41                 modID++;
42                 return super.remove(o);
43         }
44         
45         @Override
46         public boolean removeAll(Collection<?> c) {
47                 modID++;
48                 return super.removeAll(c);
49         }
50         
51         @Override
52         public boolean retainAll(Collection<?> c) {
53                 modID++;
54                 return super.retainAll(c);
55         }
56         
57         
58         @Override
59         public int getModID() {
60                 return modID;
61         }
62         
63         @SuppressWarnings("unchecked")
64         @Override
65         public MonitorableSet<E> clone() {
66                 return (MonitorableSet<E>) super.clone();
67         }
68         
69         private class MonitorableIterator<F> implements Iterator<F> {
70                 private final Iterator<F> iterator;
71                 
72                 public MonitorableIterator(Iterator<F> iterator) {
73                         this.iterator = iterator;
74                 }
75                 
76                 @Override
77                 public boolean hasNext() {
78                         return iterator.hasNext();
79                 }
80
81                 @Override
82                 public F next() {
83                         return iterator.next();
84                 }
85
86                 @Override
87                 public void remove() {
88                         iterator.remove();
89                         modID++;
90                 }
91         }
92 }