1 21 package com.db4o.foundation; 22 23 import com.db4o.types.Unversioned; 24 25 30 public class Collection4 implements Iterable4, DeepClone, Unversioned { 31 32 34 35 public List4 _first; 36 37 public List4 _last; 38 39 40 public int _size; 41 42 public int _version; 43 44 private static final Object NOT_FOUND = new Object (); 45 46 public Collection4() { 47 } 48 49 public Collection4(Iterable4 other) { 50 addAll(other); 51 } 52 53 public Collection4(Iterator4 iterator) { 54 addAll(iterator); 55 } 56 57 public Object singleElement() { 58 if (size() != 1) { 59 throw new IllegalStateException (); 60 } 61 return _first._element; 62 } 63 64 69 public final void add(Object element) { 70 doAdd(element); 71 changed(); 72 } 73 74 public final void prepend(Object element) { 75 doPrepend(element); 76 changed(); 77 } 78 79 private void doPrepend(Object element) { 80 if (_first == null) { 81 doAdd(element); 82 } else { 83 _first = new List4(_first, element); 84 _size++; 85 } 86 } 87 88 private void doAdd(Object element) { 89 if (_last == null) { 90 _first = new List4(element); 91 _last = _first; 92 } else { 93 _last._next = new List4(element); 94 _last = _last._next; 95 } 96 _size++; 97 } 98 99 public final void addAll(Object [] elements) { 100 assertNotNull(elements); 101 for (int i = 0; i < elements.length; i++) { 102 add(elements[i]); 103 } 104 } 105 106 public final void addAll(Iterable4 other) { 107 assertNotNull(other); 108 addAll(other.iterator()); 109 } 110 111 public final void addAll(Iterator4 iterator) { 112 assertNotNull(iterator); 113 while (iterator.moveNext()) { 114 add(iterator.current()); 115 } 116 } 117 118 public final void clear() { 119 _first = null; 120 _last = null; 121 _size = 0; 122 changed(); 123 } 124 125 public final boolean contains(Object element) { 126 return getInternal(element) != NOT_FOUND; 127 } 128 129 public boolean containsAll(Iterator4 iter) { 130 assertNotNull(iter); 131 while (iter.moveNext()) { 132 if (!contains(iter.current())) { 133 return false; 134 } 135 } 136 return true; 137 } 138 139 142 public final boolean containsByIdentity(Object element) { 143 Iterator4 i = internalIterator(); 144 while (i.moveNext()) { 145 Object current = i.current(); 146 if (current == element) { 147 return true; 148 } 149 } 150 return false; 151 } 152 153 157 public final Object get(Object element) { 158 Object obj = getInternal(element); 159 if(obj == NOT_FOUND){ 160 return null; 161 } 162 return obj; 163 } 164 165 private final Object getInternal(Object element){ 166 if (element == null) { 167 return containsNull() ? null : NOT_FOUND; 168 } 169 Iterator4 i = internalIterator(); 170 while (i.moveNext()) { 171 Object current = i.current(); 172 if (element.equals(current)) { 173 return current; 174 } 175 } 176 return NOT_FOUND; 177 } 178 179 private final boolean containsNull(){ 180 return containsByIdentity(null); 181 } 182 183 public Object deepClone(Object newParent) { 184 Collection4 col = new Collection4(); 185 Object element = null; 186 Iterator4 i = internalIterator(); 187 while (i.moveNext()) { 188 element = i.current(); 189 if (element instanceof DeepClone) { 190 col.add(((DeepClone) element).deepClone(newParent)); 191 } else { 192 col.add(element); 193 } 194 } 195 return col; 196 } 197 198 201 public final Object ensure(Object element) { 202 Object existing = getInternal(element); 203 if(existing == NOT_FOUND){ 204 add(element); 205 return element; 206 } 207 return existing; 208 } 209 210 216 public final Iterator4 iterator() { 217 return _first == null 218 ? Iterator4Impl.EMPTY 219 : new Collection4Iterator(this, _first); 220 } 221 222 226 public Object remove(Object a_object) { 227 List4 previous = null; 228 List4 current = _first; 229 while (current != null) { 230 if (current.holds(a_object)) { 231 _size--; 232 adjustOnRemoval(previous, current); 233 changed(); 234 return current._element; 235 } 236 previous = current; 237 current = current._next; 238 } 239 return null; 240 } 241 242 private void adjustOnRemoval(List4 previous, List4 removed) { 243 if (removed == _first) { 244 _first = removed._next; 245 } else { 246 previous._next = removed._next; 247 } 248 if (removed == _last) { 249 _last = previous; 250 } 251 } 252 253 public final int size() { 254 return _size; 255 } 256 257 public final boolean isEmpty() { 258 return _size == 0; 259 } 260 261 266 public final Object [] toArray(Object [] a_array) { 267 int j = 0; 268 Iterator4 i = internalIterator(); 269 while (i.moveNext()) { 270 a_array[j++] = i.current(); 271 } 272 return a_array; 273 } 274 275 public final Object [] toArray() { 276 Object [] array = new Object [_size]; 277 toArray(array); 278 return array; 279 } 280 281 public String toString() { 282 if (_size == 0) { 283 return "[]"; 284 } 285 StringBuffer sb = new StringBuffer (); 286 sb.append("["); 287 Iterator4 i = internalIterator(); 288 i.moveNext(); 289 sb.append(i.current()); 290 while (i.moveNext()) { 291 sb.append(", "); 292 sb.append(i.current()); 293 } 294 sb.append("]"); 295 return sb.toString(); 296 } 297 298 private void changed() { 299 ++_version; 300 } 301 302 int version() { 303 return _version; 304 } 305 306 private void assertNotNull(Object element) { 307 if (element == null) { 308 throw new ArgumentNullException(); 309 } 310 } 311 312 316 private Iterator4 internalIterator() { 317 return new Iterator4Impl(_first); 318 } 319 } | Popular Tags |