1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.joda.primitives.collection.impl;
17
18 import java.util.Collection;
19 import java.util.Iterator;
20 import java.util.NoSuchElementException;
21
22 import org.joda.primitives.IntUtils;
23 import org.joda.primitives.collection.IntCollection;
24 import org.joda.primitives.iterator.IntIterator;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 public class ArrayIntCollection extends AbstractIntCollection implements Cloneable {
44
45
46
47 private static final int MIN_GROWTH_SIZE = 4;
48
49 private static final int GROWTH_FACTOR_MULTIPLIER = 3;
50
51 private static final int GROWTH_FACTOR_DIVISOR = 2;
52
53
54 private int[] data;
55
56 private int size;
57
58
59
60
61 public ArrayIntCollection() {
62 super();
63 data = IntUtils.EMPTY_INT_ARRAY;
64 }
65
66
67
68
69
70
71 public ArrayIntCollection(int initialSize) {
72 super();
73 if (initialSize <= 0) {
74 data = IntUtils.EMPTY_INT_ARRAY;
75 } else {
76 data = new int[initialSize];
77 }
78 }
79
80
81
82
83
84
85 public ArrayIntCollection(int[] values) {
86 super();
87 if (values == null) {
88 data = IntUtils.EMPTY_INT_ARRAY;
89 } else {
90 data = (int[]) values.clone();
91 size = values.length;
92 }
93 }
94
95
96
97
98
99
100 public ArrayIntCollection(Collection<?> coll) {
101 super();
102 if (coll == null) {
103 data = IntUtils.EMPTY_INT_ARRAY;
104 } else if (coll instanceof IntCollection) {
105 IntCollection c = (IntCollection) coll;
106 size = c.size();
107 data = new int[size];
108 c.toIntArray(data, 0);
109 } else {
110 data = toPrimitiveArray(coll);
111 size = coll.size();
112 }
113 }
114
115
116
117
118
119
120 public ArrayIntCollection(Iterator<Integer> it) {
121 super();
122 if (it == null) {
123 data = IntUtils.EMPTY_INT_ARRAY;
124 } else if (it instanceof IntIterator) {
125 IntIterator typed = (IntIterator) it;
126 data = new int[MIN_GROWTH_SIZE];
127 while (typed.hasNext()) {
128 add(typed.nextInt());
129 }
130 } else {
131 data = new int[MIN_GROWTH_SIZE];
132 while (it.hasNext()) {
133 add(it.next());
134 }
135 }
136 }
137
138
139
140
141
142
143
144
145 public int size() {
146 return size;
147 }
148
149
150
151
152
153
154 public IntIterator iterator() {
155 return new PIterator(this);
156 }
157
158
159
160
161
162
163
164
165 public boolean add(int value) {
166 ensureCapacity(size + 1);
167 data[size++] = value;
168 return true;
169 }
170
171
172
173
174
175
176
177
178
179 public void optimize() {
180 if (size < data.length) {
181 int[] array = new int[size];
182 System.arraycopy(data, 0, array, 0, size);
183 data = array;
184 }
185 }
186
187
188
189
190
191
192 protected boolean isAddModifiable() {
193 return true;
194 }
195
196
197
198
199
200
201 protected boolean isRemoveModifiable() {
202 return true;
203 }
204
205
206
207
208
209
210 public boolean isModifiable() {
211 return true;
212 }
213
214
215
216
217
218
219
220
221
222 public boolean contains(int value) {
223 for (int i = 0; i < size; i++) {
224 if (data[i] == value) {
225 return true;
226 }
227 }
228 return false;
229 }
230
231
232
233
234
235
236
237 public void clear() {
238 size = 0;
239 }
240
241
242
243
244
245
246
247 public boolean addAll(int[] values) {
248 checkAddModifiable();
249 if (values == null || values.length == 0) {
250 return false;
251 }
252 return doAdd(0, values);
253 }
254
255
256
257
258
259
260
261 public boolean addAll(IntCollection values) {
262 checkAddModifiable();
263 if (values == null || values.size() == 0) {
264 return false;
265 }
266 int len = values.size();
267 ensureCapacity(size + len);
268 values.toIntArray(data, size);
269 size += len;
270 return true;
271 }
272
273
274
275
276
277
278
279
280
281
282
283
284
285 public boolean addAll(int startInclusive, int endInclusive) {
286 int increase = endInclusive - startInclusive + 1;
287 if (increase < 0) {
288 return false;
289 }
290 ensureCapacity(size + increase);
291 int i = startInclusive;
292 while (i < endInclusive) {
293 data[size++] = i++;
294 }
295 data[size++] = i;
296 return true;
297 }
298
299
300
301
302
303
304 public Object clone() {
305 ArrayIntCollection cloned = (ArrayIntCollection) super.clone();
306 cloned.data = (int[]) data.clone();
307 return cloned;
308 }
309
310
311
312
313
314
315
316
317
318
319 protected void arrayCopy(int fromIndex, int[] dest, int destIndex, int size) {
320 System.arraycopy(data, fromIndex, dest, destIndex, size);
321 }
322
323
324
325
326
327
328
329
330
331
332
333 protected boolean doAdd(int index, int[] values) {
334 int len = values.length;
335 ensureCapacity(size + len);
336 System.arraycopy(values, 0, data, size, len);
337 size += len;
338 return (len > 0);
339 }
340
341
342
343
344
345
346 protected void doRemoveIndex(int index) {
347 System.arraycopy(data, index + 1, data, index, size - 1 - index);
348 size--;
349 }
350
351
352
353
354
355
356
357 protected void ensureCapacity(int reqCapacity) {
358 int curCapacity = data.length;
359 if (reqCapacity <= curCapacity) {
360 return;
361 }
362 int newCapacity = curCapacity * GROWTH_FACTOR_MULTIPLIER / GROWTH_FACTOR_DIVISOR;
363 if ((newCapacity - curCapacity) < MIN_GROWTH_SIZE) {
364 newCapacity = curCapacity + MIN_GROWTH_SIZE;
365 }
366 if (newCapacity < reqCapacity) {
367 newCapacity = reqCapacity;
368 }
369 int[] newArray = new int[newCapacity];
370 System.arraycopy(data, 0, newArray, 0, curCapacity);
371 data = newArray;
372 }
373
374
375
376
377
378
379 protected static class PIterator implements IntIterator {
380
381 private final ArrayIntCollection collection;
382 private int cursor = 0;
383 private boolean canRemove = false;
384
385 protected PIterator(ArrayIntCollection coll) {
386 super();
387 this.collection = coll;
388 }
389
390 public boolean hasNext() {
391 return (cursor < collection.size);
392 }
393
394 public int nextInt() {
395 if (hasNext() == false) {
396 throw new NoSuchElementException("No more elements available");
397 }
398 canRemove = true;
399 return collection.data[cursor++];
400 }
401
402 public Integer next() {
403 return collection.toObject(nextInt());
404 }
405
406 public void remove() {
407 if (canRemove == false) {
408 throw new IllegalStateException("Element cannot be removed");
409 }
410 collection.doRemoveIndex(--cursor);
411 canRemove = false;
412 }
413
414 public boolean isModifiable() {
415 return collection.isModifiable();
416 }
417
418 public boolean isResettable() {
419 return true;
420 }
421
422 public void reset() {
423 cursor = 0;
424 }
425 }
426
427 }