/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esper.pattern; import java.io.Serializable; import java.util.Arrays; public class EvalStateNodeNumber implements Serializable { private static final long serialVersionUID = 4881487549563453035L; private int[] stateNumber; private int hashCode; /** * Ctor - constructs a top-level node number. */ public EvalStateNodeNumber() { stateNumber = new int[0]; computeHashCode(); } /** * Contructs a given node number. * * @param number to contruct */ public EvalStateNodeNumber(int[] number) { this.stateNumber = number; computeHashCode(); } /** * Get the depth of the node number. * * @return ordinal */ public int getOrdinalNumber() { return stateNumber[stateNumber.length - 1]; } /** * Generates a new child node number to the current node number with the given child id. * * @param newStateNumber child's node num * @return child node num */ public EvalStateNodeNumber newChildNum(int newStateNumber) { int[] num = new int[stateNumber.length + 1]; System.arraycopy(stateNumber, 0, num, 0, stateNumber.length); num[stateNumber.length] = newStateNumber; return new EvalStateNodeNumber(num); } /** * Generates a new sibling node number to the current node. * * @return sibling node */ public EvalStateNodeNumber newSiblingState() { int size = stateNumber.length; int[] num = new int[size]; System.arraycopy(stateNumber, 0, num, 0, size); num[size - 1] = stateNumber[size - 1] + 1; return new EvalStateNodeNumber(num); } public String toString() { return Arrays.toString(stateNumber); } /** * Returns the internal number representation. * * @return state number */ public int[] getStateNumber() { return stateNumber; } public int hashCode() { return hashCode; } public boolean equals(Object otherObj) { if (!(otherObj instanceof EvalStateNodeNumber)) { return false; } EvalStateNodeNumber other = (EvalStateNodeNumber) otherObj; int[] otherNum = other.getStateNumber(); if (otherNum.length != stateNumber.length) { return false; } for (int i = 0; i < stateNumber.length; i++) { if (otherNum[i] != stateNumber[i]) { return false; } } return true; } private void computeHashCode() { hashCode = 7; for (int i = 0; i < stateNumber.length; i++) { hashCode ^= stateNumber[i]; } } }