001 package com.thaiopensource.validate.nrl;
002
003 class IntSet {
004 static private final int INIT_SIZE = 4;
005 private int[] v = null;
006 private int len = 0;
007
008 void add(int n) {
009 if (v == null) {
010 v = new int[INIT_SIZE];
011 v[0] = n;
012 len = 1;
013 return;
014 }
015 if (len == v.length) {
016 int[] newv = new int[len*2];
017 System.arraycopy(v, 0, newv, 0, len);
018 v = newv;
019 }
020 if (n > v[len - 1]) {
021 v[len++] = n;
022 return;
023 }
024 int i = 0;
025 for (; i < len; i++) {
026 if (n <= v[i]) {
027 if (n == v[i])
028 return;
029 break;
030 }
031 }
032 for (int j = len; j >= i; j--)
033 v[j + 1] = v[j];
034 v[i] = n;
035 ++len;
036 }
037
038 void addAll(IntSet is) {
039 if (is.len == 0)
040 return;
041 int[] newv = new int[len + is.len];
042 int i = 0, j = 0, k = 0;
043 while (i < len && j < is.len) {
044 if (v[i] < is.v[j])
045 newv[k++] = v[i++];
046 else if (is.v[j] < v[i])
047 newv[k++] = is.v[j++];
048 else {
049 newv[k++] = v[i++];
050 j++;
051 }
052 }
053 while (i < len)
054 newv[k++] = v[i++];
055 while (j < is.len)
056 newv[k++] = is.v[j++];
057 v = newv;
058 len = k;
059 }
060
061 int size() {
062 return len;
063 }
064
065 int get(int i) {
066 if (i >= len)
067 throw new IndexOutOfBoundsException();
068 try {
069 return v[i];
070 }
071 catch (NullPointerException e) {
072 throw new IndexOutOfBoundsException();
073 }
074 }
075 }