/* * ClosedHashOfLabels.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; import gate.jape.BasicPatternElement; import com.ontotext.jape.pda.TransitionPDA; /** * This class implements closed hash of elements of type Transition * * @author petar.mitankin * */ public class ClosedHashOfLabels extends ClosedHashOfObjects { private boolean epsilon = false; /** * Puts a transition in the closed hash. * * @param t * @return the number of the transition */ public int put(TransitionPDA t) { return put((Object) t); } /** * Gets an array of all transitions that are stored in the closed hash. A * change of one these transition will make the hash table inconsistent. * * @return */ public TransitionPDA[] getCopyOfTransitions() { TransitionPDA[] t = new TransitionPDA[objectsStored]; for (int i = 0; i < objectsStored; i++) { t[i] = (TransitionPDA) objects[i]; } return t; } /** * Gets the number of transitions that are stored in the closed hash. * * @return */ public int getTransitionsStored() { if (epsilon) { return objectsStored + 1; } return objectsStored; } /** * Marks that a transition with labeled with epsilon was put in the closed * hash. */ public void addEpsilon() { epsilon = true; } protected int getHashCode(Object o) { TransitionPDA t = (TransitionPDA) o; int type = t.getType(); int code; if (type == TransitionPDA.TYPE_CONSTRAINT) { BasicPatternElement c = t.getConstraints(); if (c == null) { // epsilon transition code = CodeInt.code(1, 0, hash.length); } else { code = CodeInt.code(2, 0, hash.length); String s = c.toString(); int length = s.length(); for (int i = 0; i < length; i++) { code = CodeInt.code(s.charAt(i), code, hash.length); } } } else if (type == TransitionPDA.TYPE_OPENING_ROUND_BRACKET) { code = CodeInt.code(3, 0, hash.length); } else { code = CodeInt.code(4, 0, hash.length); code = CodeInt.code(type, code, hash.length); } return (code); } protected boolean equal(Object o1, Object o2) { TransitionPDA t1 = (TransitionPDA) o1; TransitionPDA t2 = (TransitionPDA) o2; int type1 = t1.getType(); int type2 = t2.getType(); if (type1 != type2) { return false; } if (type1 == TransitionPDA.TYPE_CONSTRAINT) { BasicPatternElement c1 = t1.getConstraints(); BasicPatternElement c2 = t2.getConstraints(); if (c1 == null) { return c2 == null; } else if (c2 == null) { return false; } return c1.toString().equals(c2.toString()); } return true; } }