/*
* WholeSet.java
*
* Copyright (c) 2010-2011, Ontotext (www.ontotext.com).
*
* This file is part of GATE (see http://gate.ac.uk/), and is free
* software, licenced under the GNU Library General Public License,
* Version 2, June 1991 (in the distribution as file licence.html,
* and also available at http://gate.ac.uk/gate/licence.html).
*
*
* $Id$
*/
package com.ontotext.jape.automaton;
public class WholeSet {
protected GenericWholeArrray hash;
protected GenericWholeArrray set;
protected int stored;
public WholeSet(int type) {
set = new GenericWholeArrray(type, 64);
if (type == GenericWholeArrray.TYPE_CHAR) {
type = GenericWholeArrray.TYPE_SHORT;
}
int hashLength = 63;
hash = new GenericWholeArrray(type, hashLength);
for (int i = 0; i < hashLength; i++) {
hash.setElement(i, Constants.NO);
}
}
public int add(int n) {
int i, index;
int hashLength = hash.length();
for (i = CodeInt.code(n, 0, hashLength); (index = hash.elementAt(i)) != Constants.NO; i = (i + Constants.hashStep)
% hashLength) {
if (n == set.elementAt(index)) {
return (index);
}
}
if (stored == set.length()) {
set.realloc(2 * stored, stored);
}
set.setElement(stored, n);
hash.setElement(i, stored);
stored++;
if (10 * stored > 9 * hashLength) {
hashLength = 2 * hashLength + 1;
hash.realloc(hashLength, 0);
for (i = 0; i < hashLength; i++) {
hash.setElement(i, Constants.NO);
}
for (int j = 0; j < stored; j++) {
for (i = CodeInt.code(set.elementAt(j), 0, hashLength); hash
.elementAt(i) != Constants.NO; i = (i + Constants.hashStep)
% hashLength)
;
hash.setElement(i, j);
}
}
return (stored - 1);
}
public int contains(int n) {
int i, index;
int hashLength = hash.length();
for (i = CodeInt.code(n, 0, hashLength); (index = hash.elementAt(i)) != Constants.NO; i = (i + Constants.hashStep)
% hashLength) {
if (n == set.elementAt(index)) {
return (index);
}
}
return -1;
}
public GenericWholeArrray getSet() {
return (set);
}
public int getStored() {
return (stored);
}
}