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