1 package org.sourceforge.jemm.database.components.types.util;
2
3 import java.util.List;
4
5 import org.sourceforge.jemm.collections.internal.ContainsRequest;
6 import org.sourceforge.jemm.collections.internal.ContainsResponse;
7 import org.sourceforge.jemm.collections.internal.RemoveRequest;
8 import org.sourceforge.jemm.collections.internal.RemoveResponse;
9 import org.sourceforge.jemm.collections.internal.StoredValue;
10 import org.sourceforge.jemm.collections.internal.set.SetAddRequest;
11 import org.sourceforge.jemm.collections.internal.set.SetAddResponse;
12
13 public class HashedSetBucket extends HashedBucket<SetEntry> {
14 private static final long serialVersionUID = 1L;
15
16 public HashedSetBucket(int hashCode) {
17 super(hashCode);
18 }
19
20 public SetAddResponse add(SetAddRequest addRequest) {
21 StoredValue value = addRequest.getValue();
22
23 if(containsExactMatch(value))
24 return new SetAddResponse(false);
25
26 if(isDistinctFromAll(addRequest.getDistinctFrom())) {
27 head = new SetEntry(value,head);
28 return new SetAddResponse(true);
29 }
30
31 return new SetAddResponse(toArray());
32 }
33
34 private boolean isDistinctFromAll(StoredValue[] distinctFrom) {
35 SetEntry current = head;
36 while(current != null) {
37 if(!valueInDistinctSet(current.value,distinctFrom))
38 return false;
39 current = current.next;
40 }
41 return true;
42 }
43
44 private boolean valueInDistinctSet(StoredValue value, StoredValue[] distinctFrom) {
45 if(distinctFrom == null)
46 return false;
47
48 for (StoredValue distinctItem : distinctFrom)
49 if(value.equals(distinctItem))
50 return true;
51 return false;
52 }
53
54 private boolean containsExactMatch(StoredValue value) {
55 SetEntry current = head;
56 while(current != null) {
57 if(value.equals(current.value))
58 return true;
59 current = current.next;
60 }
61
62 return false;
63 }
64
65 private StoredValue[] toArray() {
66 if(head == null)
67 return new StoredValue[0];
68
69 StoredValue values[] = new StoredValue[size()];
70 head.addToArray(0, values);
71 return values;
72 }
73
74 private Object[] toValueArray() {
75
76 int size = size();
77 Object values[] = new Object[size];
78
79
80 SetEntry current = head;
81 for(int i=0;i<size;i++) {
82 values[i] = current.value.getValue();
83 current = current.next;
84 }
85 return values;
86 }
87
88 public ContainsResponse contains(ContainsRequest req) {
89 if(head == null)
90 return new ContainsResponse(false);
91
92 StoredValue cValue = req.getValue();
93
94 if(head.contains(cValue,null))
95 return new ContainsResponse(true);
96 else
97 return new ContainsResponse(false,toArray());
98 }
99
100 public RemoveResponse remove(RemoveRequest req) {
101 StoredValue toRemove = req.getValue();
102
103 if(head == null)
104 return new RemoveResponse(false);
105
106
107 if(toRemove.equals(head.value)) {
108 head = head.next;
109 return new RemoveResponse(true);
110 }
111
112
113 boolean removed = head.remove(toRemove);
114 if(removed)
115 return new RemoveResponse(true);
116 else
117 return new RemoveResponse(false,toValueArray());
118 }
119
120 public void addValuesToList(List<Object> l) {
121 if(head != null)
122 head.addValuesToList(l);
123 }
124
125 public void addRaw(StoredValue value) {
126 head = new SetEntry(value,head);
127 }
128 }