4 package net
.kezvh
.collections
.views
;
6 import java
.util
.AbstractCollection
;
7 import java
.util
.Collection
;
8 import java
.util
.Iterator
;
10 import net
.kezvh
.functional
.Operations
;
11 import net
.kezvh
.functional
.lambda
.L1
;
15 * @param <D> the destination type
16 * @param <S> the source type
18 public class CollectionView
<S
, D
> extends AbstractCollection
<D
> {
20 private final Collection
<S
> innerCollection
;
21 private final L1
<D
, S
> mappingFunction
;
22 private final L1
<S
, D
> inverseFunction
;
25 * @param innerCollection collection to map
26 * @param mappingFunction function to map collection
28 @SuppressWarnings("unchecked")
29 public CollectionView(final Collection
<S
> innerCollection
, final L1
<D
, S
> mappingFunction
) {
30 this(innerCollection
, mappingFunction
, (L1
<S
, D
>) Operations
.UNSUPPORTED
);
34 * @param innerCollection COMMENT
35 * @param mappingFunction COMMENT
36 * @param inverseFunction COMMENT
38 public CollectionView(final Collection
<S
> innerCollection
, final L1
<D
, S
> mappingFunction
, final L1
<S
, D
> inverseFunction
) {
40 if (innerCollection
== null)
41 throw new IllegalArgumentException();
42 this.innerCollection
= innerCollection
;
43 this.mappingFunction
= mappingFunction
;
44 this.inverseFunction
= inverseFunction
;
48 * @see java.util.AbstractCollection#iterator()
52 public Iterator
<D
> iterator() {
53 return new IteratorView
<S
, D
>(this.mappingFunction
, this.innerCollection
.iterator());
57 * @see java.util.AbstractCollection#size()
58 * @return size of the collecion
62 return this.innerCollection
.size();
66 * @return the mappingFunction
68 public L1
<D
, ?
super S
> getMappingFunction() {
69 return this.mappingFunction
;
73 public boolean add(final D o
) {
74 return this.innerCollection
.add(this.inverseFunction
.op(o
));
78 * @see java.lang.Object#hashCode()
82 public int hashCode() {
85 result
= prime
* result
+ ((this.innerCollection
== null) ?
0 : this.innerCollection
.hashCode());
86 result
= prime
* result
+ ((this.inverseFunction
== null) ?
0 : this.inverseFunction
.hashCode());
87 result
= prime
* result
+ ((this.mappingFunction
== null) ?
0 : this.mappingFunction
.hashCode());
92 * @see java.lang.Object#equals(java.lang.Object)
97 public boolean equals(final Object obj
) {
102 if (this.getClass() != obj
.getClass())
104 final CollectionView
<?
, ?
> other
= (CollectionView
<?
, ?
>) obj
;
105 if (this.innerCollection
== null) {
106 if (other
.innerCollection
!= null)
108 } else if (!this.innerCollection
.equals(other
.innerCollection
))
110 if (this.inverseFunction
== null) {
111 if (other
.inverseFunction
!= null)
113 } else if (!this.inverseFunction
.equals(other
.inverseFunction
))
115 if (this.mappingFunction
== null) {
116 if (other
.mappingFunction
!= null)
118 } else if (!this.mappingFunction
.equals(other
.mappingFunction
))
124 * @see java.util.AbstractCollection#addAll(java.util.Collection)
128 @SuppressWarnings("unchecked")
130 public boolean addAll(final Collection
<?
extends D
> c
) {
131 final Collection
<S
> inverse
= new CollectionView
<D
, S
>((Collection
<D
>) c
, this.inverseFunction
, this.mappingFunction
);
132 return this.innerCollection
.addAll(inverse
);
136 * @see java.util.AbstractCollection#clear()
139 public void clear() {
140 this.innerCollection
.clear();
144 * @see java.util.AbstractCollection#contains(java.lang.Object)
148 @SuppressWarnings("unchecked")
150 public boolean contains(final Object o
) {
151 if (this.inverseFunction
.equals(Operations
.UNSUPPORTED
))
152 return super.contains(o
);
153 return this.innerCollection
.contains(this.inverseFunction
.op((D
) o
));
157 * @see java.util.AbstractCollection#containsAll(java.util.Collection)
161 @SuppressWarnings("unchecked")
163 public boolean containsAll(final Collection
<?
> c
) {
164 if (this.inverseFunction
.equals(Operations
.UNSUPPORTED
))
165 return super.containsAll(c
);
167 final Collection
<S
> inverse
= new CollectionView
<D
, S
>((Collection
<D
>) c
, this.inverseFunction
, this.mappingFunction
);
168 return this.innerCollection
.containsAll(inverse
);
172 * @see java.util.AbstractCollection#remove(java.lang.Object)
176 @SuppressWarnings("unchecked")
178 public boolean remove(final Object o
) {
179 if (this.inverseFunction
.equals(Operations
.UNSUPPORTED
))
182 return this.innerCollection
.remove(this.inverseFunction
.op((D
) o
));
186 * @see java.util.AbstractCollection#isEmpty()
190 public boolean isEmpty() {
191 return this.innerCollection
.isEmpty();
195 * @see java.util.AbstractCollection#removeAll(java.util.Collection)
199 @SuppressWarnings("unchecked")
201 public boolean removeAll(final Collection
<?
> c
) {
202 if (this.inverseFunction
.equals(Operations
.UNSUPPORTED
))
203 return super.removeAll(c
);
205 final Collection
<S
> inverse
= new CollectionView
<D
, S
>((Collection
<D
>) c
, this.inverseFunction
, this.mappingFunction
);
206 return this.innerCollection
.removeAll(inverse
);
210 * @see java.util.AbstractCollection#retainAll(java.util.Collection)
214 @SuppressWarnings("unchecked")
216 public boolean retainAll(final Collection
<?
> c
) {
217 if (this.inverseFunction
.equals(Operations
.UNSUPPORTED
))
218 return super.removeAll(c
);
220 final Collection
<S
> inverse
= new CollectionView
<D
, S
>((Collection
<D
>) c
, this.inverseFunction
, this.mappingFunction
);
221 return this.innerCollection
.removeAll(inverse
);