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    }