1 module java.util.ArrayList; 2 3 import java.lang.all; 4 import java.util.AbstractList; 5 import java.util.List; 6 import java.util.ListIterator; 7 import java.util.Collection; 8 import java.util.Iterator; 9 10 class ArrayList : AbstractList, List { 11 private Object[] data; 12 13 this(){ 14 } 15 this(int size){ 16 data.length = size; 17 data.length = 0; 18 } 19 this(Collection col){ 20 this(cast(int)(col.size*1.1)); 21 addAll(col); 22 } 23 override 24 void add(int index, Object element){ 25 data.length = data.length +1; 26 System.arraycopy( data, index, data, index+1, data.length - index -1 ); 27 data[index] = element; 28 } 29 override 30 bool add(Object o){ 31 data ~= o; 32 return true; 33 } 34 override 35 public bool add(String o){ 36 return add(stringcast(o)); 37 } 38 override 39 bool addAll(Collection c){ 40 if( c.size() is 0 ) return false; 41 size_t idx = data.length; 42 data.length = data.length + c.size(); 43 foreach( o; c ){ 44 data[ idx++ ] = o; 45 } 46 return true; 47 } 48 override 49 bool addAll(int index, Collection c){ 50 implMissing( __FILE__, __LINE__ ); 51 return false; 52 } 53 override 54 void clear(){ 55 data.length = 0; 56 } 57 ArrayList clone(){ 58 implMissing( __FILE__, __LINE__ ); 59 return null; 60 } 61 override 62 bool contains(Object o){ 63 foreach( v; data ){ 64 if( o is v ){ 65 return true; 66 } 67 if(( o is null ) || ( v is null )){ 68 continue; 69 } 70 if( o == v ){ 71 return true; 72 } 73 } 74 return false; 75 } 76 override 77 bool contains(String o){ 78 return contains(stringcast(o)); 79 } 80 override 81 bool containsAll(Collection c){ 82 implMissing( __FILE__, __LINE__ ); 83 return false; 84 } 85 override 86 equals_t opEquals(Object o){ 87 if( auto other = cast(ArrayList)o ){ 88 if( data.length !is other.data.length ){ 89 return false; 90 } 91 for( int i = 0; i < data.length; i++ ){ 92 if( data[i] is other.data[i] ){ 93 continue; 94 } 95 if(( data[i] is null ) || ( other.data[i] is null )){ 96 return false; 97 } 98 if( data[i] == other.data[i] ){ 99 continue; 100 } 101 return false; 102 } 103 return true; 104 } 105 return false; 106 } 107 override 108 Object get(int index){ 109 return data[index]; 110 } 111 public override hash_t toHash(){ 112 // http://java.sun.com/j2se/1.4.2/docs/api/java/util/List.html#hashCode() 113 hash_t hashCode = 1; 114 for( int i = 0; i < data.length; i++ ){ 115 Object obj = data[i]; 116 hashCode = 31 * hashCode + (obj is null ? 0 : obj.toHash()); 117 } 118 return hashCode; 119 } 120 override 121 int indexOf(Object o){ 122 foreach( i, v; data ){ 123 if( data[i] is o ){ 124 return cast(int)/*64bit*/i; 125 } 126 if(( data[i] is null ) || ( o is null )){ 127 continue; 128 } 129 if( data[i] == o ){ 130 return cast(int)/*64bit*/i; 131 } 132 } 133 return -1; 134 } 135 override 136 bool isEmpty(){ 137 return data.length is 0; 138 } 139 class LocalIterator : Iterator{ 140 int idx = -1; 141 public this(){ 142 } 143 public bool hasNext(){ 144 return idx+1 < data.length; 145 } 146 public Object next(){ 147 idx++; 148 Object res = data[idx]; 149 return res; 150 } 151 public void remove(){ 152 implMissing( __FILE__, __LINE__ ); 153 this.outer.remove(idx); 154 idx--; 155 } 156 } 157 158 override 159 Iterator iterator(){ 160 return new LocalIterator(); 161 } 162 override 163 int lastIndexOf(Object o){ 164 foreach_reverse( i, v; data ){ 165 if( data[i] is o ){ 166 return cast(int)/*64bit*/i; 167 } 168 if(( data[i] is null ) || ( o is null )){ 169 continue; 170 } 171 if( data[i] == o ){ 172 return cast(int)/*64bit*/i; 173 } 174 } 175 return -1; 176 } 177 178 class LocalListIterator : ListIterator { 179 int idx_next = 0; 180 public bool hasNext(){ 181 return idx_next < data.length; 182 } 183 public Object next(){ 184 Object res = data[idx_next]; 185 idx_next++; 186 return res; 187 } 188 public void remove(){ 189 implMissing( __FILE__, __LINE__ ); 190 this.outer.remove(idx_next); 191 idx_next--; 192 } 193 public void add(Object o){ 194 implMissing( __FILE__, __LINE__ ); 195 } 196 public void add(String o){ 197 implMissing( __FILE__, __LINE__ ); 198 } 199 public bool hasPrevious(){ 200 return idx_next > 0; 201 } 202 public int nextIndex(){ 203 return idx_next; 204 } 205 public Object previous(){ 206 idx_next--; 207 Object res = data[idx_next]; 208 return res; 209 } 210 public int previousIndex(){ 211 return idx_next-1; 212 } 213 public void set(Object o){ 214 implMissing( __FILE__, __LINE__ ); 215 } 216 } 217 218 override 219 ListIterator listIterator(){ 220 return new LocalListIterator(); 221 } 222 override 223 ListIterator listIterator(int index){ 224 implMissing( __FILE__, __LINE__ ); 225 return null; 226 } 227 override 228 Object remove(int index){ 229 Object res = data[index]; 230 System.arraycopy( data, index+1, data, index, data.length - index - 1 ); 231 data.length = data.length -1; 232 return res; 233 } 234 override 235 bool remove(Object o){ 236 int idx = -1; 237 for( int i = 0; i < data.length; i++ ){ 238 if( data[i] is null ? o is null : data[i] == o ){ 239 idx = i; 240 break; 241 } 242 } 243 if( idx is -1 ){ 244 return false; 245 } 246 for( int i = idx + 1; i < data.length; i++ ){ 247 data[i-1] = data[i]; 248 } 249 data.length = data.length - 1; 250 return true; 251 } 252 override 253 public bool remove(String key){ 254 return remove(stringcast(key)); 255 } 256 override 257 bool removeAll(Collection c){ 258 implMissing( __FILE__, __LINE__ ); 259 return false; 260 } 261 override 262 bool retainAll(Collection c){ 263 implMissing( __FILE__, __LINE__ ); 264 return false; 265 } 266 override 267 protected void removeRange(int fromIndex, int toIndex){ 268 implMissing( __FILE__, __LINE__ ); 269 } 270 override 271 Object set(int index, Object element){ 272 Object res = data[index]; 273 data[index] = element; 274 return res; 275 } 276 override 277 int size(){ 278 return cast(int)/*64bit*/data.length; 279 } 280 override 281 List subList(int fromIndex, int toIndex){ 282 implMissing( __FILE__, __LINE__ ); 283 return null; 284 } 285 override 286 Object[] toArray(){ 287 return data.dup; 288 } 289 override 290 Object[] toArray(Object[] a){ 291 if( data.length <= a.length ){ 292 a[ 0 .. data.length ] = data; 293 } 294 else{ 295 return data.dup; 296 } 297 if( data.length < a.length ){ 298 a[data.length] = null; 299 } 300 return a; 301 } 302 override 303 String[] toArray(String[] a){ 304 version(Tango){ 305 auto res = a; 306 if( res.length < data.length ){ 307 res.length = data.length; 308 } 309 int idx = 0; 310 foreach( o; data ){ 311 res[idx] = stringcast(o); 312 } 313 return res; 314 } else { // Phobos 315 implMissingInPhobos(); 316 return null; 317 } 318 } 319 320 // only for D 321 override 322 public int opApply (int delegate(ref Object value) dg){ 323 foreach( o; data ){ 324 auto res = dg( o ); 325 if( res ) return res; 326 } 327 return 0; 328 } 329 override 330 public String toString(){ 331 return super.toString(); 332 } 333 } 334