001: /*
002: * Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
003: * (http://h2database.com/html/license.html).
004: * Initial Developer: H2 Group
005: */
006: package org.h2.util;
007:
008: import org.h2.constant.SysProperties;
009: import org.h2.message.Message;
010:
011: /**
012: * An array with integer element.
013: */
014: public class IntArray {
015:
016: private int[] data;
017: private int size;
018: private int hash;
019:
020: public IntArray() {
021: data = new int[10];
022: }
023:
024: public IntArray(int[] data) {
025: this .data = data;
026: size = data.length;
027: }
028:
029: public void add(int value) {
030: checkCapacity();
031: data[size++] = value;
032: }
033:
034: public int get(int i) {
035: if (SysProperties.CHECK && i >= size) {
036: throw new ArrayIndexOutOfBoundsException("i=" + i
037: + " size=" + size);
038: }
039: return data[i];
040: }
041:
042: public int remove(int i) {
043: if (SysProperties.CHECK && i >= size) {
044: throw new ArrayIndexOutOfBoundsException("i=" + i
045: + " size=" + size);
046: }
047: int value = data[i];
048: System.arraycopy(data, i + 1, data, i, size - i - 1);
049: size--;
050: return value;
051: }
052:
053: private void checkCapacity() {
054: if (size >= data.length) {
055: int[] d = new int[data.length * 2];
056: System.arraycopy(data, 0, d, 0, data.length);
057: data = d;
058: }
059: }
060:
061: public void add(int i, int value) {
062: if (SysProperties.CHECK && i > size) {
063: throw new ArrayIndexOutOfBoundsException("i=" + i
064: + " size=" + size);
065: }
066: checkCapacity();
067: if (i == size) {
068: add(value);
069: } else {
070: System.arraycopy(data, i, data, i + 1, size - i);
071: data[i] = value;
072: size++;
073: }
074: }
075:
076: public void set(int i, int value) {
077: if (SysProperties.CHECK && i >= size) {
078: throw new ArrayIndexOutOfBoundsException("i=" + i
079: + " size=" + size);
080: }
081: data[i] = value;
082: }
083:
084: public boolean equals(Object obj) {
085: if (!(obj instanceof IntArray)) {
086: return false;
087: }
088: IntArray other = (IntArray) obj;
089: if (hashCode() != other.hashCode() || size != other.size) {
090: return false;
091: }
092: for (int i = 0; i < size; i++) {
093: if (data[i] != other.data[i]) {
094: return false;
095: }
096: }
097: return true;
098: }
099:
100: public int hashCode() {
101: if (hash != 0) {
102: return hash;
103: }
104: int h = size + 1;
105: for (int i = 0; i < size; i++) {
106: h = h * 31 + data[i];
107: }
108: hash = h;
109: return h;
110: }
111:
112: public int size() {
113: return size;
114: }
115:
116: public void addValueSorted(int value) {
117: int l = 0, r = size;
118: while (l < r) {
119: int i = (l + r) >>> 1;
120: int d = data[i];
121: if (d == value) {
122: return;
123: } else if (d > value) {
124: r = i;
125: } else {
126: l = i + 1;
127: }
128: }
129: add(l, value);
130: }
131:
132: // public void addValueSorted(int value) {
133: // int l = 0, r = size - 1;
134: // while(l <= r) {
135: // int i = (l + r) >>> 1;
136: // int d = data[i];
137: // if(d == value) {
138: // return;
139: // } else if(d > value) {
140: // r = i - 1;
141: // } else {
142: // l = i + 1;
143: // }
144: // }
145: // add(l, value);
146: // }
147:
148: public void removeValue(int value) {
149: for (int i = 0; i < size; i++) {
150: if (data[i] == value) {
151: remove(i);
152: return;
153: }
154: }
155: throw Message.getInternalError();
156: }
157:
158: public int findNextValueIndex(int value) {
159: int l = 0, r = size;
160: while (l < r) {
161: int i = (l + r) >>> 1;
162: int d = data[i];
163: if (d >= value) {
164: r = i;
165: } else {
166: l = i + 1;
167: }
168: }
169: return l;
170:
171: // for(int i=0; i<size; i++) {
172: // if(data[i] >= value) {
173: // return i;
174: // }
175: // }
176: // return size;
177: }
178:
179: public void sort() {
180: // insertion sort
181: for (int i = 1, j; i < size(); i++) {
182: int t = get(i);
183: for (j = i - 1; j >= 0 && (get(j) > t); j--) {
184: set(j + 1, get(j));
185: }
186: set(j + 1, t);
187: }
188: }
189:
190: public void toArray(int[] array) {
191: System.arraycopy(data, 0, array, 0, size);
192: }
193:
194: // ArrayList data = new ArrayList();
195: //
196: // public IntArray() {
197: // }
198: //
199: // public IntArray(int[] data) {
200: // for (int i = 0; i < data.length; i++) {
201: // this.data.add(new Integer(data[i]));
202: // }
203: // }
204: //
205: // public void add(int value) {
206: // this.data.add(new Integer(value));
207: // }
208: //
209: // public int get(int i) {
210: // return ((Integer) data.get(i)).intValue();
211: // }
212: //
213: // public void remove(int i) {
214: // data.remove(i);
215: // }
216: //
217: // public void add(int i, int value) {
218: // data.add(i, new Integer(value));
219: // }
220: //
221: // public void set(int i, int value) {
222: // data.set(i, new Integer(value));
223: // }
224: //
225: // public int size() {
226: // return data.size();
227: // }
228:
229: }
|